Pandas groupby 类别,评分,从每个类别中获得最高价值?

您所在的位置:网站首页 python选手评分 Pandas groupby 类别,评分,从每个类别中获得最高价值?

Pandas groupby 类别,评分,从每个类别中获得最高价值?

2023-03-24 21:15| 来源: 网络整理| 查看: 265

回答问题

关于 SO 的第一个问题,对 pandas 来说非常新,并且在术语上仍然有点不稳定:我正在尝试找出数据帧上正确的语法/操作序列,以便能够按 B 列分组,找到最大值(或最小值) C 列中每个组的对应值,并检索 A 列中的对应值。

假设这是我的数据框:

name type votes bob dog 10 pete cat 8 fluffy dog 5 max cat 9

使用df.groupby('type').votes.agg('max')返回:

dog 10 cat 9

到目前为止,一切都很好。但是,我想弄清楚如何返回:

dog 10 bob cat 9 max

我已经到了df.groupby(['type', 'votes']).name.agg('max'),尽管返回

dog 5 fluffy 10 bob cat 8 pete 9 max

...这对于这个假装的数据框来说很好,但在使用更大的数据框时并没有多大帮助。

非常感谢!

Answers

如果df有一个没有重复值的索引,那么可以使用idxmax返回每个组的最大行的索引。然后使用df.loc选择整行:

In [322]: df.loc[df.groupby('type').votes.agg('idxmax')] Out[322]: name type votes 3 max cat 9 0 bob dog 10

如果df.index有重复值,即不是唯一索引,则先使索引唯一:

df = df.reset_index()

然后使用idxmax:

result = df.loc[df.groupby('type').votes.agg('idxmax')]

如果确实需要,可以将df恢复到原来的状态:

df = df.set_index(['index'], drop=True)

但总的来说,有了唯一索引,生活会好得多。

这是一个示例,说明当df没有唯一索引时会出现什么问题。假设index是AABB:

import pandas as pd df = pd.DataFrame({'name': ['bob', 'pete', 'fluffy', 'max'], 'type': ['dog', 'cat', 'dog', 'cat'], 'votes': [10, 8, 5, 9]}, index=list('AABB')) print(df) # name type votes # A bob dog 10 # A pete cat 8 # B fluffy dog 5 # B max cat 9

idxmax返回索引值A和B:

print(df.groupby('type').votes.agg('idxmax')) type cat B dog A Name: votes, dtype: object

但是A和B并没有唯一指定所需的行。df.loc[...]返回索引值为A或B的所有行:

print(df.loc[df.groupby('type').votes.agg('idxmax')]) # name type votes # B fluffy dog 5 # B max cat 9 # A bob dog 10 # A pete cat 8

相反,如果我们重置索引:

df = df.reset_index() # index name type votes # 0 A bob dog 10 # 1 A pete cat 8 # 2 B fluffy dog 5 # 3 B max cat 9

然后可以使用df.loc选择所需的行:

print(df.groupby('type').votes.agg('idxmax')) # type # cat 3 # dog 0 # Name: votes, dtype: int64 print(df.loc[df.groupby('type').votes.agg('idxmax')]) # index name type votes # 3 B max cat 9 # 0 A bob dog 10


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3