从多索引数据框中获取最大值

时间:2017-06-07 06:13:31

标签: python pandas dataframe multi-index

我的数据框看起来像下图: enter image description here

这里的uid和id是索引。此数据框是从单个索引数据框转换而来的,因此某些列存在重复值。对于每个 uid avg_diff 的所有值都相同,但不同的uid将具有此字段的不同值。我想获得最大的10个 avg_diff 值,使用不同的uid。

注意:这是一个巨大的数据框架,所以我正在寻找最优化的方式。

2 个答案:

答案 0 :(得分:1)

我认为您可以先get_level_values删除重复项,duplicated boolean indexing删除重复项,~用于反转布尔值掩码。

然后使用DataFrame.nlargestsort_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])