在熊猫变换中应用几种功能


问题内容

之后groupby,在使用时agg,如果通过dict,columns:functions则将在相应的列中应用函数。不过,此语法不适用于transform。还有其他方法可以在其中应用多个功能transform吗?

让我们举个例子:

import pandas as pd
df_test = pd.DataFrame([[1,2,3],[1,20,30],[2,30,50],[1,2,33],[2,4,50]],columns = ['a','b','c'])
Out[1]:
    a   b   c
0   1   2   3
1   1   20  30
2   2   30  50
3   1   2   33
4   2   4   50

def my_fct1(series):
    return series.mean()

def my_fct2(series):
    return series.std()

df_test.groupby('a').agg({'b':my_fct1,'c':my_fct2})

Out[2]:
    c   b
a       
1   16.522712   8
2   0.000000    17

前面的示例显示了如何将不同的函数应用于中的不同列agg,但是如果我们要转换这些列而不进行汇总,agg则无法再使用。因此:

df_test.groupby('a').transform({'b':np.cumsum,'c':np.cumprod})
Out[3]:
TypeError: unhashable type: 'dict'

我们如何使用以下预期输出执行此类操作:

    a   b   c
0   1   2   3
1   1   22  90
2   2   30  50
3   1   24  2970
4   2   34  2500

问题答案:

我认为现在(pandas 0.20.2)函数transformdict使用具有类似功能的列名实现agg

如果函数返回的Series长度相同:

df1 = df_test.set_index('a').groupby('a').agg({'b':np.cumsum,'c':np.cumprod}).reset_index()
print (df1)
   a     c   b
0  1     3   2
1  1    90  22
2  2    50  30
3  1  2970  24
4  2  2500  34

但是如果集合长度不同,则需要join

df2 = df_test[['a']].join(df_test.groupby('a').agg({'b':my_fct1,'c':my_fct2}), on='a')
print (df2)
   a          c   b
0  1  16.522712   8
1  1  16.522712   8
2  2   0.000000  17
3  1  16.522712   8
4  2   0.000000  17