【问题标题】:In columns containining 'X', check for and delete rows containing 'Y'在包含“X”的列中,检查并删除包含“Y”的行
【发布时间】:2023-03-22 19:15:01
【问题描述】:

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

此外,我们将不胜感激有关掩码/查询的帮助,因为我从未使用过它们。

输入 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(like='Company')

【问题讨论】:

  • 在提问时尽量提供Minimal, Complete, and Verifiable example。如果有 pandas 问题,请提供示例 inputoutput 数据集(CSV/dict/JSON/Python 代码格式的 5-7 行 作为文本,因此可以在为您编写答案时使用它)。这将有助于避免以下情况your code isn't working for meit doesn't work with my data 等。
  • 谢谢。用数据框的前三行和错误以及它发生的位置编辑了我的问题
  • 你有很多重复的列(相同的列名) - 你怎么能使用这个 DF???
  • 好点。我寻找了一种不同的方式来处理事情,并提出了一个新问题,即在加载到 excel 文件中的 for 循环中删除最终文件中的 NaN 行,并从除了最终加载到 excel 文件中之外的所有列中删除许多重复的列

标签: python pandas


【解决方案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

使用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

【讨论】:

  • 由于过滤器,我得到“ValueError: cannot reindex from a duplicate axis”...
  • @FredericBastiat,您能否发布一个有助于重现您的错误的数据集?
  • 在这里发表评论有点乱。我将在您可以识别潜在问题的地方进行描述。公司列在一行中都将具有相同的值。许多行都有 NaN 值(可能也在 Company 列中)。许多公司列具有相同的名称(只有名为 Company_y 和 Company_x 的公司列)。还有许多其他(但不是全部)列名称类似(例如 meeting_x 和 meeting_y)
【解决方案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 进行保存/其他操作。

【讨论】:

    猜你喜欢
    • 2018-09-06
    • 2023-03-19
    • 2021-07-21
    • 1970-01-01
    • 2011-01-10
    • 2014-03-18
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    相关资源
    最近更新 更多