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

Posted

技术标签:

【中文标题】Pandas groupby 类别,评级,从每个类别中获得最高价值?【英文标题】:Pandas groupby category, rating, get top value from each category? 【发布时间】:2015-06-17 00:39:18 【问题描述】:

关于 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

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

非常感谢!

【问题讨论】:

【参考方案1】:

如果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 没有唯一性时会出现什么问题 指数。假设indexAABB

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 返回索引值AB

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

AB 并没有唯一指定所需的行。 df.loc[...] 返回索引值为AB的所有行:

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

【讨论】:

非常感谢!仍在尝试掌握索引的窍门,将更彻底地阅读文档。再次感谢! 我不知道这是如何处理海量数据集的,但我发现这是完成这项任务的最简洁,因此也是最优雅的解决方案。我已经找了好几个小时了。【参考方案2】:
df= df.groupby('type').agg('votes': ['count','mean','median','min','max'])
print(ds_method_range)

【讨论】:

以上是关于Pandas groupby 类别,评级,从每个类别中获得最高价值?的主要内容,如果未能解决你的问题,请参考以下文章

pandas.groupby中的迭代

Pandas Groupby:计数和平均值相结合

针对不同类别的其他列 pandas 和 seaborn 或 matplotlib 的 Groupby 逐年绘制

Pandas groupby top5 产品

使用 Pandas 在同一图中绘制分组数据

Seaborn通过多个groupby绘制熊猫数据框