我有以下熊猫数据框:
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”列的不同值。
答案 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