Python Groupby显示最大值和相应的标签-熊猫
我试图将特定值分组,并返回一个单独列的最大值。我还希望返回与此最大值关联的相应标签。使用下面的方法,我将根据Python Groupby显示最大值和相应的标签-熊猫,python,pandas,Python,Pandas,我试图将特定值分组,并返回一个单独列的最大值。我还希望返回与此最大值关联的相应标签。使用下面的方法,我将根据项目、组、方向对值进行分组,最大值由值确定。我希望返回相应的标签,其中包含相应的最大值值 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,20
项目、组、方向对值进行分组,最大值由值
确定。我希望返回相应的标签
,其中包含相应的最大值值
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
尝试使用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
按最大值与for标签一起使用,然后按重塑,添加用于追加所有缺少的组合,排序多索引,最后将其展平:
max_num = (df.loc[df.groupby(['Item','Group','Direction'])['Value']
.idxmax()]
.pivot('Item', ['Direction','Group'], ['Value','Label'])
.rename(columns={'Label':'ID'})
)
max_num = max_num.reindex(pd.MultiIndex.from_product(max_num.columns.levels), axis=1)
max_num['Value'] = max_num['Value'].fillna(0)
max_num = max_num.sort_index(level=[2,1], axis=1, ascending=[True, False])
max_num.columns = [f'{x[2]}_{x[1]}_{x[0]}' for x in max_num.columns]
max_num = max_num.reset_index()
print (max_num)
Item Green_Up_ID Green_Up_Value Green_Down_ID Green_Down_Value \
0 10 M 310.0 NaN 0.0
Red_Up_ID Red_Up_Value Red_Down_ID Red_Down_Value
0 D 260.0 B 300.0
df[df['Value']==df['Value'].max()]['Label'].values[0]
这就是您要做的吗?我收到一个错误:KeyError:'Level Group not found'
在数据透视上检查列名。我已经根据您提供的示例df发布了工作代码。很抱歉,.pivot
不起作用,但pivot\u table
起作用。我需要升级pandas.pivot\u table
我得到一个类似的错误,如下所示。显然,建议使用.pivot\u table
而不是。pivot
。这是可行的,但是需要修改排序索引amended@jonboy-好的,我们需要升级熊猫,有可能吗?是的,成功了。唯一的问题是为缺少的值插入0和nan。@jonboy-我看到了,正在为它工作。@jonboy-添加到答案中。