根据条件删除重复项

时间:2021-04-05 21:54:51

标签: python pandas

我有以下熊猫数据框:

df = pd.DataFrame([[5, 10],[8, 40],[8, 50],[10, 390], [10, 395], [10, 405], [11, 390], [11, 395], [11, 405], [13, 390], [13, 395], [13, 405]], columns=['index', 'so_id'])
<头>
索引 so_id
5 10
8 40
8 50
10 390
10 395
10 405
11 390
11 395
11 405
13 390
13 395
13 405

所需的输出如下:

<头>
索引 so_id
5 10
8 40
10 390
11 395
13 405

基本上,我的目标是删除“index”列上的重复项,同时为“so_id”列保留一个不同的升序值。

关键是我不想在变量“index”上使用简单的 drop_duplicates,因为这会让我在 drop_duplicates 之后得到相同的“so_id”。我想在“索引”上使用 drop_duplicates,同时获取“so_id”列的不同值。

2 个答案:

答案 0 :(得分:4)

如果您的值已排序,您可以这样做:

seen = set()


def fn(x):
    for val in x:
        if val in seen:
            continue
        seen.add(val)
        return val


df = df.groupby("index")["so_id"].apply(fn).reset_index()
print(df)

打印:

   index  so_id
0      5     10
1      8     40
2     10    390
3     11    395
4     13    405

答案 1 :(得分:2)

有点蛮力,但即使简单的“获取第一个可用数字”策略导致死胡同(因此更通用),也会找到解决方案。如果找不到解决方案,也会告诉您(很可能是这种情况):

n_tries = 1000
for _ in range(n_tries):
    df2 = df.groupby('index').apply(lambda g:g.sample(n=1))
    if df2['so_id'].is_unique:
        print('solution\n',df2)
        break
else:
    print('no solution found')

输出

solution
          index  so_id
index                
5     0      5     10
8     2      8     50
10    5     10    405
11    7     11    395
13    9     13    390