假设我要删除行,其中任何单元格(标题包含“X”的列)包含单词“acme”。我目前的想法是添加一个for循环(对于包含X的列标题),然后使用先前定义的掩码来删除'acme'行。有没有更好的办法?
此外,一些关于面具/查询的帮助将不胜感激,因为我从未使用它们。
输入DF:
Company_x First Name Last Name Emails_x Created_x Hosted Meetings 03112016 Facilitated Meetings_x Attended Meetings_x Company_y Emails_y ... Created_x Hosted Meetings 04122016 Facilitated Meetings_x Attended Meetings_x Company_y Emails_y Created_y Hosted Meetings 04212016 Facilitated Meetings_y Attended Meetings_y
0 TS X Y X@Y.com 03/10/2016 0.0 0.0 0.0 TS X@Y.com ... 03/10/2016 0.0 0.0 2.0 NaN NaN NaN NaN NaN NaN
1 TS X Y X@Y.com 03/10/2016 0.0 0.0 0.0 TS X@Y.com ... 01/25/2016 0.0 0.0 0.0 NaN NaN NaN NaN NaN NaN
2 TS X Y X@Y.com 03/10/2016 0.0 0.0 0.0 TS X@Y.com ... 04/06/2015 9.0 10.0 17.0 NaN NaN NaN NaN NaN NaN
ValueError:无法从重复轴重新索引 all_users_sheets_hosts.filter(像= '公司')
答案 0 :(得分:1)
你可以这样做:
In [150]: df
Out[150]:
A AXA X ZXZ ZZNX
0 acme axa pacme aaa 1
1 meca A BZZZ ccc 2
2 YYY a c me 3
3 000 macme 111 2222 4
In [151]: df[(df.filter(like='X').astype(str).apply(lambda x: x.str.contains('acme')))
.....: .sum(axis=1)==0
.....: ]
Out[151]:
A AXA X ZXZ ZZNX
1 meca A BZZZ ccc 2
2 YYY a c me 3
说明:
使用filter()
我们可以过滤包含X
:
In [152]: df.filter(like='X')
Out[152]:
AXA X ZXZ ZZNX
0 axa pacme aaa 1
1 A BZZZ ccc 2
2 a c me 3
3 macme 111 2222 4
使用acme
函数
apply()
的单元格
In [153]: df.filter(like='X').astype(str).apply(lambda x: x.str.contains('acme'))
Out[153]:
AXA X ZXZ ZZNX
0 False True False False
1 False False False False
2 False False False False
3 True False False False
在Python中:True == 1
,False ==0
,因此每行sum(axis=1)
中的求和单元格将为我们提供1
行,其中至少有一个单元格包含我们的搜索词和{ {1}} - 其他地方:
0
答案 1 :(得分:0)
试试这个:
import pandas as pd
df = pd.DataFrame([[11,'acme'],[22,'samme'],[33,'mamme']],columns=('SI','X'))
bool_arr = ~df.X.str.contains('acme')
df1 = df[bool_arr]
print df1
您现在可以使用df1进行保存/其他操作。