Pandas:df.groupby(x, y).apply()跨多列参数错误

14 浏览
0 Comments

Pandas:df.groupby(x, y).apply()跨多列参数错误

基本问题:

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

这两个问题可以实现这个目标,但是当我尝试类似的方法时,出现了一个错误,说我的函数deltas得到了一个未知的参数axis

数据示例:

exports_past    exports_now    imports_past    imports_now    等(其他6对)
   .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):
    '''
    简单的百分比变化
    '''
    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'

有没有办法解决axis参数错误?或者有没有更优雅的方法来计算百分比变化?我问题的关键在于我需要能够在几对不同的列上应用这个函数,所以像第2个问题中的答案那样硬编码列名是不可取的。谢谢!

0
0 Comments

问题出现的原因是使用了错误的参数。在groupby apply中,不能使用axis参数,而是将kwarg参数传递给函数。解决方法是不使用axis参数,或者在groupby中使用axis参数。

具体来说,DataFrame的apply方法可以接受axis参数,示例代码如下:

df.apply(lambda x: x[0] + x[1], axis=0)
df.apply(lambda x: x[0] + x[1], axis=1)

而groupby的apply方法不能接受axis参数,示例代码如下:

g.apply(lambda x: x[0] + x[1])
g.apply(lambda x: x[0] + x[1], axis=1) # 出现错误:TypeError: () got an unexpected keyword argument 'axis'

如果确实需要在groupby中使用axis参数,可以在groupby中使用axis参数,示例代码如下:

g1 = df.groupby(0, axis=1)
g1.apply(lambda x: x.iloc[0, 0] + x.iloc[1, 0])

另外,有人建议使用pct_change方法来实现类似的功能,该方法可以用于计算序列或DataFrame的百分比变化。示例代码如下:

df.pct_change()

通过整理上述内容,我们可以得出以下结论:Pandas的df.groupby(x, y).apply()方法在多列参数上出现错误,原因是使用了错误的参数。解决方法是不使用axis参数,或者在groupby中使用axis参数。此外,还可以考虑使用pct_change方法来实现类似的功能。

0