关于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
...这对于这个伪装数据帧来说很好,但在使用更大的数据帧时并没有多大帮助。
非常感谢!
答案 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
没有唯一身份时出现的问题
指数。假设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
答案 1 :(得分:0)
df= df.groupby('type').agg({'votes': ['count','mean','median','min','max']})
print(ds_method_range)