在熊猫变换中应用几种功能
问题内容:
之后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)函数transform
未dict
使用具有类似功能的列名实现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