我正在尝试对特定值进行分组并返回单独列的最大值。我还希望返回与此最大值相关联的相应标签。使用下面,我按 Item, Group, Direction
对值进行分组,最大值由 Value
确定。我希望返回相应的 Label
与 Value
中的相应最大值。
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
答案 0 :(得分:1)
尝试使用 Groupby.transform
和 df.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.idxmax
和 DataFrame.loc
为 Labels
按最大值,然后按 DataFrame.pivot
重新整形,添加 DataFrame.reindex
以追加所有缺失的组合,排序 {{1 }} 并最后压平它:
MultiIndex