Multi-Groupby(迭代或应用函数)
Posted
技术标签:
【中文标题】Multi-Groupby(迭代或应用函数)【英文标题】:Multi-Groupby (iterate or apply function) 【发布时间】:2019-06-22 03:53:54 【问题描述】:发帖是因为这是我第一次找不到问题的答案。我已经接近了,但没有骰子。我正在尝试迭代、for 循环或将函数应用于按两列分组的 pandas 数据帧,我想要获取的数据位于第 1 列和第 2 列分组后的第三列中。
给定样本数据:
df = pd.DataFrame('Class':np.random.randint(1,10,100),'Type':np.random.choice(list('ABCD'),100),'Guid':np.random.randint(10000,99999,100))
如果我使用
for name,group in df.groupby(['Class','Type']):
print(name)
print(group.Guid)
或
for name,group in df.groupby(['Class','Type'])['Guid']:
print(name)
print(group)
两者都让我得到想要的输出
(1, 'A')
86 86606
89 69999
Name: Guid, dtype: int32
(1, 'B')
0 71982
67 95343
68 84520
75 57036
87 61938
Name: Guid, dtype: int32
(1, 'C')
48 67008
Name: Guid, dtype: int32
(1, 'D')
4 87947
6 98477
13 78437
53 95792
76 66178
Name: Guid, dtype: int32
(2, 'A')
42 47960
Name: Guid, dtype: int32
(2, 'B')
30 69891
82 84436
91 54546
Name: Guid, dtype: int32
(3, 'A')
5 74182
19 12167
35 99939
78 38939
Name: Guid, dtype: int32
(3, 'B')
16 92239
27 25167
41 84245
47 43174
51 50472
Name: Guid, dtype: int32
接下来我想做的是一些数学运算或在其分组设置中将函数应用于“Guid”,而不是标准均值、标准、计数等。这些工作正常,甚至可以聚合它们。
df.groupby(['Class','Type']).Guid.mean()
Class Type
1 A 78302.500000
B 74163.800000
C 67008.000000
D 85366.200000
2 A 47960.000000
B 69624.333333
3 A 56306.750000
B 59059.400000
C 31237.000000
D 61973.000000
4 A 36573.000000
B 55441.250000
C 49381.333333
D 35420.000000
5 A 57252.500000
B 59267.250000
C 48885.000000
D 62163.000000
6 A 43106.800000
B 46767.500000
C 23170.000000
D 31663.000000
7 A 47804.750000
B 61570.666667
C 60989.666667
D 57300.000000
8 A 55890.000000
B 50629.000000
D 26312.000000
9 A 13338.500000
B 49556.000000
C 66602.400000
D 58603.500000
Name: Guid, dtype: float64
但是我想不通的是,当“Guid”按 ['Class','Type'] 分组时,如何将我自己的数学或函数应用于“Guid”。例如,如果我想计算“Guid”中的值更改超过 10,000 的次数。
df.groupby(['Class','Type']).Guid.apply(function or maths here)
df.groupby(['Class','Type']).agg(['count','mean','std',somefunctionhere]).Guid
非常感谢任何帮助!
【问题讨论】:
那么问题是如何定义一个适用于分组系列的函数? This question 之前被问过,并给出了如何定义自定义聚合函数的示例,除了内置的 agg 方法之外,您还可以使用这些函数。 @Dark,是的系列。我可以将函数应用于组,而不是组内的系列。当我认为我已经接近时,我得到的最常见错误是 KeyError: 0, Exception:Column(s) my column already selected, 或 TypeError: cannot convert the series to这是一个关于如何应用您自己的自定义函数的示例:
import pandas as pd
import numpy as np
def myfunc(group):
# You can do whatever you want to the group, just make sure it returns that grouping as dataframe
group['guid_sum'] = group['Guid'].sum()
return group
df = pd.DataFrame('Class':np.random.randint(1,10,100),'Type':np.random.choice(list('ABCD'),100),'Guid':np.random.randint(10000,99999,100))
group = df.groupby(['Class','Type'])
applied = group.apply(myfunc)
【讨论】:
以上是关于Multi-Groupby(迭代或应用函数)的主要内容,如果未能解决你的问题,请参考以下文章