对于以下数据框中的每个Name
,我尝试查找从一个Time
到Amount
列的下一个百分比变化:
创建数据框的代码:
import pandas as pd
df = pd.DataFrame({'Name': ['Ali', 'Ali', 'Ali', 'Cala', 'Cala', 'Cala', 'Elena', 'Elena', 'Elena'],
'Time': [1, 2, 3, 1, 2, 3, 1, 2, 3],
'Amount': [24, 52, 34, 95, 98, 54, 32, 20, 16]})
df.sort_values(['Name', 'Time'], inplace = True)
我尝试的第一种方法(基于this question and answer)使用了groupby
和pct_change
:
df['pct_change'] = df.groupby(['Name'])['Amount'].pct_change()
结果:
这似乎没有按名称分组,因为它的结果与我没有使用groupby
并调用df['Amount'].pct_change()
的结果相同。根据{{1}}的{{3}},上述方法应该可以计算出每个值相对于组中先前值的百分比变化。
第二种方法是将pandas.core.groupby.DataFrameGroupBy.pct_change
与groupby
和apply
结合使用:
pct_change
结果:
这次所有百分比更改都是正确的。
为什么df['pct_change_with_apply'] = df.groupby('Name')['Amount'].apply(lambda x: x.pct_change())
和groupby
方法不能返回正确的值,而将pct_change
与groupby
一起使用却能返回正确的值?
编辑2018年1月28日:此行为已在最新版本的Pandas 0.24.0中得到纠正。要安装,请运行apply
。
答案 0 :(得分:2)
@piRSquared已在评论中指出;这是由于bug filed on Github under issue #21621。它似乎已经在里程碑0.24.0
中解决(由于2018年12月31日)。我的版本(0.23.4
)仍显示此错误行为。