7

基本问题:

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

这两个问题完成了这一点,但是当我尝试类似的方法时,我得到一个错误,即我的函数 deltas get an unknown parameter 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 变化的方法?我的问题的关键是我需要能够在几个不同的列对中应用这个函数,所以像第二个问题中的答案那样硬编码列名是不可取的。谢谢!

4

1 回答 1

5

考虑使用pct_changeSeries/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
于 2013-07-31T15:07:07.487 回答