Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取groupby中元组值列的idxmax或idxmin_Python_Pandas_Numpy_Pandas Groupby - Fatal编程技术网

Python 获取groupby中元组值列的idxmax或idxmin

Python 获取groupby中元组值列的idxmax或idxmin,python,pandas,numpy,pandas-groupby,Python,Pandas,Numpy,Pandas Groupby,我有一个元组值的分数,我想得到对应于最大值的行。我想做的一个玩具示例是: import pandas as pd df = pd.DataFrame({'id': ['a', 'a', 'b', 'b'], 'score': [(1,1,1), (1,1,2), (0, 0, 100), (8,8,8)], 'numeric_score': [1, 2, 3, 4], 'valu

我有一个元组值的分数,我想得到对应于最大值的行。我想做的一个玩具示例是:

import pandas as pd
df = pd.DataFrame({'id': ['a', 'a', 'b', 'b'], 
                   'score': [(1,1,1), (1,1,2), (0, 0, 100), (8,8,8)], 
                   'numeric_score': [1, 2, 3, 4],
                   'value':['foo', 'bar', 'baz', 'qux']})
# Works, gives correct result:
correct_df = df.loc[df.groupby('id')['numeric_score'].idxmax(), :]
# Fails with a TypeError
goal_df = df.loc[df.groupby('id')['score'].idxmax(), :] 
correct_df
具有我希望在
goal_df
中得到的结果。这会引发一系列错误,其核心似乎是:

TypeError:此数据类型不允许还原操作“argmax”

一个可行但丑陋的解决方案是:

best_scores = df.groupby('id')['score'].max().reset_index()[['id', 'score']]
goal_df = (pd.merge(df, best_scores, on=['id', 'score'])
           .groupby(['id'])
           .first()
           .reset_index())

有没有一个圆滑的版本?

我理解你的问题是:

NumPy的
.argmax()
不适用于元组。对于一系列元组,如何确定最大值元组的索引

IIUC,这将返回所需的结果:

df.loc[df.score == df.score.max()]

你期望的结果是什么?你说你想要最大值,但你能更具体一点吗?谢谢@GoodLuckGanesh,我更新了这个问题来演示我的意图。如果你的分数是
(8,8,8)
(100,0,0)
,你想要100吗?正确。我想要与标准python中相同的排序行为(例如,(100,0,0)>(8,8,8)),我想要根据标准python排序最大化元组分数的行,因此
(9,0,0)>(8,8,8)>(0,0100)
。这在全局最大值的情况下有效;这需要按组进行。是否需要相应列中的数据?否则,
df.groupby('id').score.max()
将按组获取最大值