Python Pandas:df.groupby(x,y).apply()跨多列参数错误 基本问题:

Python Pandas:df.groupby(x,y).apply()跨多列参数错误 基本问题:,python,pandas,Python,Pandas,我有几个“过去”和“现在”变量,我想对它们执行简单的“行”百分比更改。例如:((现在导出-过去导出)/过去导出)) 这两个问题完成了这一点,但当我尝试类似的方法时,我得到了一个错误,即我的函数delta获得了一个未知参数axis 数据示例: 按照第一个问题的答案, 我的解决方案是使用如下函数: 并应用如下函数: 这将生成此错误:TypeError:deltas()获取了意外的关键字参数“axis” 有没有关于如何绕过轴参数误差的想法?还是一种更优雅的方法来计算pct变化?我的问题的关键在

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

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

数据示例: 按照第一个问题的答案,

我的解决方案是使用如下函数: 并应用如下函数: 这将生成此错误:
TypeError:deltas()获取了意外的关键字参数“axis”
有没有关于如何绕过轴参数误差的想法?还是一种更优雅的方法来计算pct变化?我的问题的关键在于,我需要能够跨多个不同的列对应用此函数,因此,像第二个问题中的答案那样硬编码列名是不可取的。谢谢

考虑使用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
该方法采用axis参数:

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
没有,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 apply并删除axis参数,我会得到一个键错误
KeyError:u'no item named 0'
,以
行[0]
等方式访问元素。有没有一种方法可以使用groupby apply,并且仍然使用一种表示法,使它可以轻松地应用于几个不同名称的列对?我考虑了
df.pct_change()
函数,但我相信它只适用于单个列。例如,df.pct变化(自身,周期=1,填充方法=pad,限制=None,频率=None,**kwd)。我还没有检查源代码,但我相信它是通过类似于
.shift()
方法的方法实现的。如果这是真的,我不确定它是否可以应用于多列。@agconti已更新,您可以使用轴为1的groupby,您可以将pct_更改应用于整个数据帧。或者你想用apply(
lambda x:x.pct_change()
)对每组进行一次测试。我想我在帖子中没有100%清楚。(我更新了它)。我希望做pct_change()计算时,不要将导出中的周期移到过去和现在,而是使用这些值。例如,
((现在导出-过去导出)/过去导出)
。将轴=1传递给groupby会导致
值错误:传递的项目数错误1,索引表示0
,当这样使用时:
df['xx_delta']=df.groupby(['xx_过去','xx_现在'],轴=1)。应用(delta)
In [11]: df
Out[11]:
   0  1  2
0  1  1  1
1  2  2  2
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
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'
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