Groupby 显示最大值和相应的标签 - 熊猫

时间:2021-03-17 05:03:56

标签: python pandas

我正在尝试对特定值进行分组并返回单独列的最大值。我还希望返回与此最大值相关联的相应标签。使用下面,我按 Item, Group, Direction 对值进行分组,最大值由 Value 确定。我希望返回相应的 LabelValue 中的相应最大值。

df = pd.DataFrame({  
    'Item' : [10,10,10,10,10,10,10,10,10],  
    'Label' : ['X','V','Y','Z','D','A','E','B','M'],    
    'Value' : [80.0,80.0,200.0,210.0,260.0,260.0,300.0,300.0,310.0],  
    'Group' : ['Red','Green','Red','Green','Red','Green','Green','Red','Green'],            
    'Direction' : ['Up','Up','Down','Up','Up','Up','Up','Down','Up'],                                       
    })

max_num = (df.groupby(['Item','Group','Direction'])['Value','Label']
                   .max()
                   .unstack([1, 2], 
                   fill_value = 0)
                   .reset_index()
                   )

max_num.columns = [f'{x[0]}_{x[1]}' for x in max_num.columns]

预期输出:

   Item  Red_Up_Value Red_Up_ID  Red_Down_Value Red_Down_ID  Green_Up_Value Green_Up_ID  Green_Down_Value  Green_Down_ID
0    10         260.0         D           300.0           B           310.0           M               0.0            NaN

2 个答案:

答案 0 :(得分:1)

尝试使用 Groupby.transformdf.pivot

In [270]: df['max_value'] = df.groupby(['Item','Group','Direction'])['Value'].transform('max')

In [279]: df[df.max_value.eq(df.Value)].pivot('Item', ['Group', 'Direction', 'Label'], 'Value')
Out[279]: 
Group        Red  Green    Red  Green
Direction     Up   Down   Down     Up
Label          D      A      B      M
Item                                 
10         260.0  260.0  300.0  310.0

答案 1 :(得分:1)

使用 DataFrameGroupBy.idxmaxDataFrame.locLabels 按最大值,然后按 DataFrame.pivot 重新整形,添加 DataFrame.reindex 以追加所有缺失的组合,排序 {{1 }} 并最后压平它:

MultiIndex
相关问题