熊猫-过滤列至少匹配一次的行

时间:2018-10-05 19:20:49

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

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

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,则将其删除。

例如:

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

对于名称= Bob,ID永远不会匹配,因此将所有行都与Bob保持联系

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

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

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

不确定熊猫是否可以在某些条件匹配“至少一次”的情况下丢弃重复项。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

df.groupby('Name').apply(lambda grp: grp if not (grp['ID1'] == grp['ID2']).any() else None).dropna()

说明:Groupby名称,然后如果存在ID1和Id2不匹配的任何索引,则返回该组。否则,返回None,然后删除空列。