在包含'X'的列中,检查并删除包含'Y'的行

时间:2016-04-28 17:05:24

标签: python pandas

假设我要删除行,其中任何单元格(标题包含“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(像= '公司')

2 个答案:

答案 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 == 1False ==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进行保存/其他操作。