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

2024-06-11 05:02:41 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我想删除标题包含“X”的列中任何单元格包含单词“acme”的行。我目前的想法是添加一个for循环(对于包含X的列标题),然后使用先前定义的掩码删除“acme”行。有更好的办法吗?你知道吗

另外,在掩码/查询方面的一些帮助也将不胜感激,因为我从未使用过它们。你知道吗

输入测向:

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:无法从具有的重复轴重新索引 所有用户_主机.筛选器(比如“公司”)


Tags: namecom标题nan单词companyacmeemails
2条回答

试试这个:

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执行保存/其他操作。你知道吗

你可以这样做:

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

使用apply()函数逐列搜索包含acme的单元格

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,并且0在其他地方:

In [154]: (df.filter(like='X').astype(str).apply(lambda x: x.str.contains('acme'))).sum(axis=1)
Out[154]:
0    1
1    0
2    0
3    1
dtype: int64

相关问题 更多 >