pandas数组groupby:应用一个涉及分组索引值的函数

myzjeezk  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(84)

让我用这个简单的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)。我想我已经回答了我自己的问题。欢迎进一步讨论:)

vlurs2pr

vlurs2pr1#

使用.groupby创建一个组(grp),并使用transform创建一个计算列

import pandas as pd
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"])
grp = df.groupby('col_grp')
df['new_col'] = grp['col1'].transform('sum') + grp['col2'].transform('median')
df
Out[1]: 
   col_grp  col1  col2  new_col
0        1     1    10       34
1        1     1    30       34
2        1     2    40       34
3        2     3    50      110
4        2     3   150      110
5        2     4   100      110

字符串
要使其成为您想要自定义的自己的函数,您不必使用apply,这取决于您尝试做的事情。

import pandas as pd
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"])

def f(dataframe, col1, col2):
    grp = dataframe.groupby('col_grp')
    return grp[col1].transform('sum') + grp[col2].transform('median')

df['new_col'] = f(df, 'col1', 'col2')    
df
Out[2]: 
   col_grp  col1  col2  new_col
0        1     1    10       34
1        1     1    30       34
2        1     2    40       34
3        2     3    50      110
4        2     3   150      110
5        2     4   100      110

6l7fqoea

6l7fqoea2#

从索引创建列:
第一个月
现在可以按索引分组,并在函数中使用副本

相关问题