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