gpt4 book ai didi

python - 在 pandas 的转换中应用几个函数

转载 作者:行者123 更新时间:2023-11-28 22:26:35 24 4
gpt4 key购买 nike

groupby之后,使用agg时,如果传递了一个columns:functions的dict,函数会应用在对应的列。尽管如此,此语法不适用于 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

最佳答案

你仍然可以使用 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()

关于python - 在 pandas 的转换中应用几个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44677103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com