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

时间:2015-06-17 00:39:19

标签: python pandas dataframe

关于SO的第一个问题,对熊猫来说很新,对术语仍然有些不稳定:我试图找出数据帧上正确的语法/操作顺序,以便能够按列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

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

非常感谢!

2 个答案:

答案 0 :(得分:7)

如果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

答案 1 :(得分:0)

df= df.groupby('type').agg({'votes': ['count','mean','median','min','max']})
print(ds_method_range)