我有一个熊猫数据框,如下所示:
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')
不确定熊猫是否可以在某些条件匹配“至少一次”的情况下丢弃重复项。
答案 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,然后删除空列。