使用groupby Other并返回一个Series重命名列
使用groupby Other方法执行聚合
重命名列
名称中允许有空格
允许您以任何选择的方式对返回的列进行排序
允许列之间的交互
返回单级索引而不是MultiIndex
去做这个:
创建传递给Other的自定义函数
此自定义函数作为数据帧传递给每个组
返回系列
系列的索引将是新列
创建虚假数据
df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1", "user3"],
"Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0, 9],
'Score': [9, 1, 8, 7, 7, 6, 9]})
创建返回系列的自定义函数
my_agg内部的变量Other是一个DataFrame
def my_agg(x):
names = {
'Amount mean': x['Amount'].mean(),
'Amount std': x['Amount'].std(),
'Amount range': x['Amount'].max() - x['Amount'].min(),
'Score Max': x['Score'].max(),
'Score Sum': x['Score'].sum(),
'Amount Score Sum': (x['Amount'] * x['Score']).sum()}
return pd.Series(names, index=['Amount range', 'Amount std', 'Amount mean',
'Score Sum', 'Score Max', 'Amount Score Sum'])
将此自定义函数传递给groupby Other方法
df.groupby('User').apply(my_agg)
不利的一面是,此功能将比基于细胞的聚合的Other慢得多
将字典与groupby Other方法一起使用
由于字典的复杂性和某些模棱两可的性质,因此不再使用字典。 将来在github上正在进行有关如何改进此功能的讨论。在这里,您可以在groupby调用之后直接访问聚合列。 只需传递您希望应用的所有汇总功能的列表即可。
df.groupby('User')['Amount'].agg(['sum', 'count'])
输出量
sum count
User
user1 18.0 2
user2 20.5 3
user3 10.5 1
仍然可以使用字典为不同的列显式表示不同的聚合,例如此处是否存在另一个名为Other的数字列。
df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1"],
"Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0],
'Other': [1,2,3,4,5,6]})
df.groupby('User').agg({'Amount' : ['sum', 'count'], 'Other':['max', 'std']})
输出量
Amount Other
sum count max std
User
user1 18.0 2 6 3.535534
user2 20.5 3 5 1.527525
user3 10.5 1 4 NaN