在Python中的Pandas中,将多个自定义函数应用于多个groupby对象上的多个列



我有以下数据帧、groupby对象和函数。

df = pd.DataFrame({
'A': 'a a b b b'.split(), 
'P': 'p p p q q'.split(), 
'B': [1, 2, 3, 4, 5], 
'C': [4, 6, 5, 7, 8],
'D': [9, 10, 11, 12, 13]})
g1 = df.groupby('A')
g2 = df.groupby('P')
def f1(x, y):
return sum(x) + sum(y)
def f2(x, y):
return sum(x) - sum(y)
def f3(x, y):
return x * y

对于g1,我想

  • 将f1应用于列B和C
  • 将f2应用于列C和D

对于g2,我想

  • 将f2应用于列B和C
  • 将f3应用于列C和D

对我来说,困难在于函数,这些函数在多个列上操作。我还需要为任意列集工作的函数;注意f2是如何用于['B','C']和['C','D']的。我在语法上很吃力。

我如何使用Pandas在Python中完成所有这些事情

我不知道是否有更简单的方法,但有一种方法是使用currying。我找不到使用groupby结构添加列的方法(所涉及的结构是围绕不可变数据设计的(,所以我只是直接处理groupby对象中的数据。您可以看到以下代码是否符合您的要求:

def sum_curry(x, y):
return lambda df: sum(df[x]) + sum(df[y])
def diff_curry(x, y):
return lambda df: sum(df[x]) - sum(df[y])
def append_prod(df):
df['E'] = df['C']*df['D']
return df

g1_sums = g1.apply(sum_curry('B','C'))
g1_diffs = g1.apply(diff_curry('C','D'))
g2_diffs = g2.apply(diff_curry('B','C'))
g2_with_prod = [(group[0], append_prod(group[1])) for group in g2]

最新更新