这里的uid和id是索引。此数据框是从单个索引数据框转换而来的,因此某些列存在重复值。对于每个 uid , avg_diff 的所有值都相同,但不同的uid将具有此字段的不同值。我想获得最大的10个 avg_diff 值,使用不同的uid。
注意:这是一个巨大的数据框架,所以我正在寻找最优化的方式。
答案 0 :(得分:1)
我认为您可以先get_level_values
删除重复项,duplicated
boolean indexing
删除重复项,~
用于反转布尔值掩码。
然后使用DataFrame.nlargest
或sort_values
+ head
:
df = pd.DataFrame({'uid':[1,1,1,2,2,3,3], 'id':[2,3,4,5,6,1,3],
'avg_diff':[0.1,0.1,0.1,0.2,0.2,0.3,0.3]})
df = df.set_index('uid').set_index('id', drop=False, append=True)
print (df)
avg_diff id
uid id
1 2 0.1 2
3 0.1 3
4 0.1 4
2 5 0.2 5
6 0.2 6
3 1 0.3 1
3 0.3 3
mask = df.index.get_level_values('uid').duplicated()
print (~mask)
[ True False False True False True False]
df = df[~mask].nlargest(2, 'avg_diff')
print (df)
avg_diff id
uid id
3 1 0.3 1
2 5 0.2 5
另一种解决方案:
mask = df.index.get_level_values('uid').duplicated()
print (~mask)
[ True False False True False True False]
df = df[~mask].sort_values('avg_diff', ascending=False).head(2)
print (df)
avg_diff id
uid id
3 1 0.3 1
2 5 0.2 5
答案 1 :(得分:0)
如果我理解你的话,你只需删除“uid”的副本,然后按avr_diff排序
unique_uid = data.reset_index().drop_duplicates("uid").set_index("uid")
print(unique_uid["avr_diff"].sort_values(ascending=False)[:10])