Python:删除Pandas数据框中包含特定字符串的所有行

14

我有一个名为data的pandas数据框,我想删除包含任何列中字符串的所有行。例如,下面我们看到“ gdp”列在索引3处有一个字符串,“ cap”在索引1处。

data =

    y  gdp  cap
0   1    2    5
1   2    3    ab
2   8    7    2
3   3    bc   7
4   6    7    7
5   4    8    3
...

我一直在尝试使用类似这样的脚本,因为事先不知道exp_list中包含什么。不幸的是,“data.var_name”会报错:“DataFrame”对象没有“var_name”属性。我也不知道字符串将在运行时是什么,所以有没有办法也把它概括起来?

exp_list = ['gdp', 'cap']

for var_name in exp_list:
    data = data[data.var_name != 'ab']
2个回答

13

您可以应用一个函数来逐行测试您的DataFrame是否存在字符串,例如,假设df是您的DataFrame

 rows_with_strings  = df.apply(
       lambda row : 
          any([ isinstance(e, basestring) for e in row ])
       , axis=1) 

这将为您的DataFrame生成一个掩码,指示哪些行包含至少一个字符串。因此,您可以通过相反的掩码选择不含字符串的行。

 df_with_no_strings = df[~rows_with_strings]

.

 a = [[1,2],['a',2], [3,4], [7,'d']]
 df = pd.DataFrame(a,columns = ['a','b'])


 df 
   a  b
0  1  2
1  a  2
2  3  4
3  7  d

select  = df.apply(lambda r : any([isinstance(e, basestring) for e in r  ]),axis=1) 

df[~select]                                                                                                                                

    a  b
 0  1  2
 2  3  4

1
这是按行还是按元素? - Romain Jouin
1
@romainjouin,如果一个字符串出现在任何元素中,它将删除一行。 - Acorbe

1
你可以进行转置,调用 ```convert_objects``` 方法(按列处理),然后比较数据类型以获取布尔键,如下所示:
df[df.T.convert_objects().dtypes != object]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接