gpt4 book ai didi

python - Pandas: df.groupby(x, y).apply() across multiple columns 参数错误

转载 作者:太空狗 更新时间:2023-10-30 00:03:14 24 4
gpt4 key购买 nike

基本问题:

我有几个“过去”和“现在”变量,我想对它们执行“逐行”的简单百分比变化。例如:((exports_now - exports_past)/exports_past))

这两个问题完成了这个,但是当我尝试类似的方法时,我得到一个错误,我的函数 deltas 得到一个未知参数 axis

数据示例:

exports_ past    exports_ now    imports_ past    imports_ now    ect.(6 other pairs)
.23 .45 .43 .22 1.23
.13 .21 .47 .32 .23
0 0 .41 .42 .93
.23 .66 .43 .22 .21
0 .12 .47 .21 1.23

根据第一个问题的答案,

我的解决方案是使用这样的函数:

def deltas(row):
'''
simple pct change
'''
if int(row[0]) == 0 and int(row[1]) == 0:
return 0
elif int(row[0]) == 0:
return np.nan
else:
return ((row[1] - row[0])/row[0])

然后像这样应用函数:

df['exports_delta'] = df.groupby(['exports_past', 'exports_now']).apply(deltas, axis=1)

这会产生此错误:TypeError: deltas() got an unexpected keyword argument 'axis'关于如何解决轴参数错误的任何想法?或者更优雅的方法来计算 pct 变化?我的问题的关键是我需要能够在几个不同的列对中应用这个函数,所以像第二个问题的答案那样对列名进行硬编码是不可取的。谢谢!

最佳答案

考虑使用 pct_change Series/DataFrame 方法来执行此操作。

df.pct_change()

混淆源于两个不同的(但同名的)apply 函数,一个在 Series/DataFrame 上,一个在 groupby 上。

In [11]: df
Out[11]:
0 1 2
0 1 1 1
1 2 2 2

DataFrame apply方法采用轴参数:

In [12]: df.apply(lambda x: x[0] + x[1], axis=0)
Out[12]:
0 3
1 3
2 3
dtype: int64

In [13]: df.apply(lambda x: x[0] + x[1], axis=1)
Out[13]:
0 2
1 4
dtype: int64

groupby apply没有,并且 kwarg 被传递给函数:

In [14]: g.apply(lambda x: x[0] + x[1])
Out[14]:
0 2
1 4
dtype: int64

In [15]: g.apply(lambda x: x[0] + x[1], axis=1)
TypeError: <lambda>() got an unexpected keyword argument 'axis'

注意:groupby 确实有一个轴参数,所以你可以在那里使用它,如果你真的想:

In [16]: g1 = df.groupby(0, axis=1)

In [17]: g1.apply(lambda x: x.iloc[0, 0] + x.iloc[1, 0])
Out[17]:
0
1 3
2 3
dtype: int64

关于python - Pandas: df.groupby(x, y).apply() across multiple columns 参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17973877/

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