让我用这个简单的df作为一个例子。
df = pd.DataFrame([[1,1,10],[1,1,30],[1,2,40],[2,3,50],[2,3,150],[2,4,100]],columns=["col_grp","col1","col2"])
col_grp col1 col2
0 1 1 10
1 1 1 30
2 1 2 40
3 2 3 50
4 2 3 150
5 2 4 100
字符串
我希望groupby 'col_grp'并将每隔一列聚合为单个值。例如,grp['col1'].apply(lambda x: x.sum())
。但不是简单的'sum'函数f(x)=sum(x),我希望计算一个复杂的函数,该函数不仅接受'col1'的pd.系列作为其输入,而且还接受分组值,即f(x,y)。在这个例子中,对于'col_grp'值= 1的组,y输入为1。x输入是'col1'系列[1,1,2]。假设f(x,y)可以编码,但其逻辑对于其他解决方法来说有点复杂,我仍然可以使用grp.apply(f)吗?如果可以,我应该如何编写语法。提前感谢您。
我刚刚发现可以应用像f(x1,x2)这样的东西,其中x1是分组后的'col1'序列,x2是'col2'序列。f(x1,x2)返回一个单一的值,这意味着每个组的统计数据。例如,
grp[['col1','col2']].apply(lambda x: x['col1'].sum() + x['col2'].median())
型
所以这可能是解决我的问题的一个有效方法。只需将分组列包含到x输入中。比如,
grp[['col_grp','col1','col2']].apply(lambda x: x['col_grp'].mean() + x['col1'].sum() + x['col2'].median())
型
我可以用任何我喜欢的方式定制f(x)。我想我已经回答了我自己的问题。欢迎进一步讨论:)
2条答案
按热度按时间vlurs2pr1#
使用
.groupby
创建一个组(grp
),并使用transform
创建一个计算列字符串
要使其成为您想要自定义的自己的函数,您不必使用
apply
,这取决于您尝试做的事情。型
6l7fqoea2#
从索引创建列:
第一个月
现在可以按索引分组,并在函数中使用副本