我有几个'过去'和'现在'变量,我想执行一个简单的百分比变化' row-wise 'on。例如:((exports_now - exports_past)/exports_past))
。
这两个问题可以实现这一点,但是当我尝试类似的方法时,我得到一个错误,我的函数增量获得了一个未知参数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的变化?我的问题是我需要能够在几个不同的列对中应用此函数,因此难以对第二个问题中的答案进行硬编码。谢谢!
答案 0 :(得分:5)
请考虑使用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方法采用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
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