如何解决Pandas 将多列分组聚合作为用户定义函数的输入
我仍在努力学习熊猫。我有一个自定义的用户定义函数,它需要两列作为输入。是聚合函数,需要分组完成。
这是我的问题:如何将多列分组聚合作为用户定义函数的输入?
这是我的可重现示例以及我尝试过的一些事情。
import pandas as pd
import numpy as np
def first_b_over_avg_c(b,c):
first_b = b.first()
avg_c = np.mean(c)
return first_b / avg_c
np.random.seed(42)
df = pd.DataFrame(
{
"a": ["one","one","two","two"],"b": np.random.uniform(0,1,8),"c": np.random.uniform(0,8)
}
)
print(df)
df.groupby(['a'],as_index = False).assign(d = lambda df: first_b_over_avg_c(df['b'],df['c']))
df.groupby(['a'],as_index = False).apply(first_b_over_avg_c,b=('b'),c=('c'))
输出如下:
a b c
0 one 0.374540 0.601115
1 one 0.950714 0.708073
2 one 0.731994 0.020584
3 one 0.598658 0.969910
4 two 0.156019 0.832443
5 two 0.155995 0.212339
6 two 0.058084 0.181825
7 two 0.866176 0.183405
和错误
回溯(最近一次调用最后一次):文件“reprex.py”,第 21 行,在 df.groupby(['a'],df['c'])) 文件 "/home/ubuntu/.local/lib/python3.8/site-packages/pandas/core/groupby/groupby.py",第 703 行,在 getattr 中 引发 AttributeError( AttributeError: 'DataFrameGroupBy' 对象没有属性 'assign'
解决方法
我认为这符合您的要求
import pandas as pd
import numpy as np
def first_b_over_avg_c(group):
first_b = group['b'].iloc[0]
avg_c = np.mean(group['c'])
return first_b / avg_c
np.random.seed(42)
df = pd.DataFrame(
{
"a": ["one","one","two","two"],"b": np.random.uniform(0,1,8),"c": np.random.uniform(0,8)
}
)
df.groupby(['a'],as_index = False).apply(first_b_over_avg_c)
如果我没看错,您想要做的就是能够从用户定义的函数访问多个列。
在这个例子中,整个行/组被传递到函数中。如果在函数中打印出组:
a b c
0 one 0.374540 0.601115
1 one 0.950714 0.708073
2 one 0.731994 0.020584
3 one 0.598658 0.969910
您可以看到组“一”和“二”分别通过。
对象未分组。每一行都将单独传递。
除非有特定原因,否则我认为单独分配和传递列没有意义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。