Python 几个函数在pandas变换中的应用

Python 几个函数在pandas变换中的应用,python,pandas,transformation,Python,Pandas,Transformation,当使用agg时,在groupby之后,如果传递了列的dict:functions,则将在相应的列中应用这些函数。然而,这种语法不适用于转换。在转换中是否有其他方法应用多个函数 让我们举一个例子: 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

当使用
agg
时,在
groupby
之后,如果传递了
列的dict:functions
,则将在相应的列中应用这些函数。然而,这种语法不适用于
转换
。在
转换中是否有其他方法应用多个函数

让我们举一个例子:

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

您仍然可以使用dict,但需要一些技巧:

df_test.groupby('a').transform(lambda x: {'b': x.cumsum(), 'c': x.cumprod()}[x.name])
Out[427]: 
    b     c
0   2     3
1  22    90
2  30    50
3  24  2970
4  34  2500
如果需要保留a列,可以执行以下操作:

df_test.set_index('a')\
       .groupby('a')\
       .transform(lambda x: {'b': x.cumsum(), 'c': x.cumprod()}[x.name])\
       .reset_index()
Out[429]: 
   a   b     c
0  1   2     3
1  1  22    90
2  2  30    50
3  1  24  2970
4  2  34  2500
另一种方法是使用if-else检查列名:

df_test.set_index('a')\
       .groupby('a')\
       .transform(lambda x: x.cumsum() if x.name=='b' else x.cumprod())\
       .reset_index()
我认为现在(pandas 0.20.2)函数不是用
dict
-列名来实现的,这些列名具有
agg
之类的函数

如果函数返回相同长度的
系列

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
但如果AGGRAGTE的长度不同,则需要:


通过对Pandas的更新,您可以使用
assign
方法以及
transform
附加新列,或用新值替换现有列:

grouper = df_test.groupby("a")

df_test.assign(b=grouper["b"].transform("cumsum"), 
               c=grouper["c"].transform("cumprod"))

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

若groupby包含多个列,那个么解决方案是什么?
grouper = df_test.groupby("a")

df_test.assign(b=grouper["b"].transform("cumsum"), 
               c=grouper["c"].transform("cumprod"))

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