【问题标题】:Pandas - Filter rows where columns match atleast oncePandas - 过滤列至少匹配一次的行
【发布时间】:2019-03-11 08:12:35
【问题描述】:

我有一个熊猫数据框,如下所示:

Name ID1    ID2
Joe  248    248
Joe  248    326
Joe  721    248
Anna 295    295
Bob  721    248
Bob  721    326
Bob  248    566

我只需要保留没有匹配 ID1 和 ID2 的行, 例外情况是,如果两个 ID 至少匹配一个名称,则删除它们。

例如:

对于 Name = Joe,ID 匹配一次 (248),因此删除所有包含 Joe 的行

对于 Name = Bob,ID 永远不会匹配,因此保留 Bob 的所有行

到目前为止,我已经尝试过:

通过对名称进行排序并检查 ID 是否匹配来删除重复项。但这并没有考虑到至少匹配一次的 ID。

df  = df.sort_values(['Name']).drop_duplicates(['Name'],keep='first')  

不确定 pandas 是否可以删除与“至少一次”匹配的条件的重复项。

【问题讨论】:

  • 在您的问题中,您说“如果两个 ID 至少匹配一个名称,则删除它们” - 您的意思是删除所有具有 该名称 的行吗?他们是否匹配?

标签: python python-3.x pandas dataframe indexing


【解决方案1】:

如果我理解正确,您可以计算要删除的名称,然后使用布尔索引:

names_to_remove = df.loc[df['ID1'] == df['ID2'], 'Name'].values

res = df[~df['Name'].isin(names_to_remove)]

print(res)

  Name  ID1  ID2
4  Bob  721  248
5  Bob  721  326
6  Bob  248  566

【讨论】:

    【解决方案2】:
    df.groupby('Name').apply(lambda grp: grp if not (grp['ID1'] == grp['ID2']).any() else None).dropna()
    

    解释:Groupby 名称,如果有任何索引 ID1 和 Id2 不匹配,则返回该组。否则,返回 None 然后删除空列。

    【讨论】:

      猜你喜欢
      • 2020-06-09
      • 2019-11-09
      • 2019-06-21
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多