1.输入:我们有一个数据帧
ID name
1 a
1 b
2 a
2 c
3 d
2.现在我取了第一个重复的"name"(这里是ID为"2"的"a")值,并删除其余的,输出:
ID name
1 a
1 b
2 c
3 d
我使用的代码:
df.loc[~df.duplicated(keep='first', subset=['name'])]
3.现在我想删除所有共享相同"ID"的行(这里删除的"a"的ID为"2",所以我们删除所有ID为"2中"的行),最终预期输出:所以我们删除[2c]
ID name
1 a
1 b
3 d
我试过的代码:但它不起作用
dt = df.name.duplicated(keep='first')
df.loc[~df.groupby(['ID','dt']).size().reset_index().drop(columns={0})]
您可以为ID使用某种黑名单:
样本数据:
import pandas as pd
d = {'ID':[1, 1, 2, 2, 3], 'name':['a', 'b', 'a', 'c', 'd']}
df = pd.DataFrame(d)
代码:
df[~df['ID'].isin(df[df['name'].duplicated()]['ID'])]
输出:
ID name
0 1 a
1 1 b
4 3 d
简化代码:
blacklist = df[df['name'].duplicated()]['ID']
mask = ~df['ID'].isin(blacklist)
df[mask]
如果数据帧是按ID排序的,那么这两种方法应该有效:
df = pd.DataFrame(data={'ID': [1, 1, 1, 2, 3], 'name': ['a', 'b', 'a', 'c', 'd']})
df1 = df.loc[~df.duplicated(keep='first', subset=['ID'])]
df2 = df1.loc[~df1.duplicated(keep='first', subset=['name'])]
print(df2)
print(df.drop_duplicates(keep='first', subset=['ID']).drop_duplicates(keep='first', subset=['name']))
ID name
0 1 a
3 2 c
4 3 d
如果它是按名称排序的,你应该做subset=[‘name’],然后子集=[‘ID’]。