python - Groupby 应用自定义函数 Pandas
问题描述
我正在尝试在 pandas 中应用一个自定义函数,类似于 dplyr 中的 groupby 和 mutate 功能。
我想要做的是说给定一个像这样的熊猫数据框:
df = pd.DataFrame({'category1':['a','a','a', 'b', 'b','b'],
'category2':['a', 'b', 'a', 'b', 'a', 'b'],
'var1':np.random.randint(0,100,6),
'var2':np.random.randint(0,100,6)}
)
df
category1 category2 var1 var2
0 a a 23 59
1 a b 54 20
2 a a 48 62
3 b b 45 76
4 b a 60 26
5 b b 13 70
应用一些函数,该函数返回与组中元素数量相同的元素数量:
def myfunc(s):
return [np.mean(s)] * len(s)
得到这个结果
df
category1 category2 var1 var2 var3
0 a a 23 59 35.5
1 a b 54 20 54
2 a a 48 62 35.5
3 b b 45 76 29
4 b a 60 26 60
5 b b 13 70 29
我在想一些事情:
df['var3'] = df.groupby(['category1', 'category2'], group_keys=False).apply(lambda x: myfunc(x.var1))
但无法让索引匹配。
在带有 dplyr 的 R 中,这将是
df <- df %>%
group_by(category1, category2) %>%
mutate(
var3 = myfunc(var1)
)
所以我能够通过使用自定义函数来解决它,例如:
def myfunc_data(data):
data['var3'] = myfunc(data.var1)
return data
和
df = df.groupby(['category1', 'category2']).apply(myfunc_data)
但我想我仍然想知道是否有办法在不定义这个自定义函数的情况下做到这一点。
解决方案
用于与 original 具有相同大小GroupBy.transform
的返回,因此可以分配给新列:Series
DataFrame
np.random.seed(123)
df = pd.DataFrame({'category1':['a','a','a', 'b', 'b','b'],
'category2':['a', 'b', 'a', 'b', 'a', 'b'],
'var1':np.random.randint(0,100,6),
'var2':np.random.randint(0,100,6)}
)
df['var3'] = df.groupby(['category1', 'category2'])['var1'].transform(myfunc)
print (df)
category1 category2 var1 var2 var3
0 a a 66 86 82
1 a b 92 97 92
2 a a 98 96 82
3 b b 17 47 37
4 b a 83 73 83
5 b b 57 32 37
替代lambda function
:
df['var3'] = (df.groupby(['category1', 'category2'])['var1']
.transform(lambda s: [np.mean(s)] * len(s)))
推荐阅读
- ios - 标签栏项目图标的大小非常奇怪
- node.js - 如何从令牌中获取用户 ID?
- regex - 如何在 Scala 中通过此 case 规则以仅接受包含字母的字符串?
- laravel - 在 Laravel 中,我试图从带有枢轴的表中获取信息
- list - 如何在 Prolog 列表中打包元组的元素
- amazon-web-services - Amazon S3 允许特定域访问存储桶
- pine-script - Pine Script:如何从图表中隐藏“输入”值?
- python - Discord wait_for() 如何添加作者的多个回复?
- javascript - Dash 中四个图形的同步缩放。如何实施?
- url-rewriting - 配置 Haproxy 前端以在请求等于 Host/A/* 时将客户端请求从 Host/A/* 重定向到 Host/B/*