Pandas:df.groupby(x, y).apply()跨多列参数错误
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个问题中的答案那样硬编码列名是不可取的。谢谢!
问题出现的原因是使用了错误的参数。在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方法来实现类似的功能。