Python 如何删除包含3个以上非ascii字符的行

Python 如何删除包含3个以上非ascii字符的行,python,pandas,dataframe,Python,Pandas,Dataframe,我想删除sms列包含超过3个垃圾值的所有记录/行,简单地说,我想删除下面给定数据帧中的第4行和第5行 id city department sms category 01 khi revenue quk respns. 1 02 lhr revenue good. 1 03 lhr revenue

我想删除
sms
列包含超过3个垃圾值的所有记录/行,简单地说,我想删除下面给定数据帧中的第4行和第5行

id    city    department    sms                    category
01    khi      revenue      quk respns.                1
02    lhr      revenue      good.                      1
03    lhr      revenue      greatœ1øið                 0
04    isb      accounts     ?xœ1øiûüð÷üœç8i            0
05    isb      accounts     %â¡ã‘ã¸$ãªã±t%rã«ãÿã©â£    0
预期数据帧:

id city department        sms   category
1  khi    revenue  quk respns.         1
2  lhr    revenue        good.         1
3  lhr    revenue   greatœ1øið         0
ascii\u string=set(“!”、-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^ ` abcdefghijklmnopqrstuvxyz{124;}~”)
对于df.iterrows()中的r,j:
对于k,j.iteritems()中的数据:
总计数=长度(数据)
ascii\u计数=总和(数据中c的ascii\u字符串中的c)
非ascii计数=总计数-ascii计数
如果非ascii计数>3:
#删除行
df=df.下降([r])
打破

ascii表仅扩展到127,这意味着如果我们执行
ord()
并得到大于127的值,则该字符不是有效的ascii字符

使用它,我们可以计算非Ascii字符的数量,并且只返回
True
,其中只有3个或更少

df.drop(df.loc[df["sms"].apply(lambda x: False if len([i for i in x if ord(i) > 127]) <= 3 else True)].index)
我们可以使用来计算列
sms
中每个字符串中正则表达式模式
[^\x00-\x7F]
(与单个非ASCII字符匹配)的出现次数,然后使用来创建
布尔掩码
,并使用此掩码来过滤行:

m = df['sms'].str.count(r'[^\x00-\x7F]').gt(3)
df = df[~m]
结果:

   id city department          sms  category
0   1  khi    revenue  quk respns.         1
1   2  lhr    revenue        good.         1
2   3  lhr    revenue   greatœ1øið         0

到现在为止你都试了些什么?谢谢,这回答了我的问题
m = df['sms'].str.count(r'[^\x00-\x7F]').gt(3)
df = df[~m]
   id city department          sms  category
0   1  khi    revenue  quk respns.         1
1   2  lhr    revenue        good.         1
2   3  lhr    revenue   greatœ1øið         0