如何让Pandas的pct_change按指定Label独立计算行的百分比变化?
按分组独立计算百分比变化(Pandas)
问题场景
现有如下DataFrame:
import pandas as pd df = pd.DataFrame([ ['A', 2], ['B', 4], ['C', 20], ['B', 8], ['C', 2], ['A', 2]], columns=['Label', 'Val1',]) print(df)
输出:
Label Val1 0 A 2 1 B 4 2 C 20 3 B 8 4 C 2 5 A 2
直接使用pct_change()会计算全局的行间变化率:
df['Val1_change'] = df['Val1'].pct_change(periods=1)
得到的结果是与上一行(无论Label是否相同)的对比:
Label Val1 Val1_change 0 A 2 NaN 1 B 4 1.00 2 C 20 4.00 3 B 8 -0.60 4 C 2 -0.75 5 A 2 0.00
但需求是按相同Label分组,组内独立计算与上一个同Label行的百分比变化,预期结果:
Label Val1 Val1_change 0 A 2 NaN 1 B 4 NaN 2 C 20 NaN 3 B 8 1.00 # 与上一行B对比增长100% 4 C 2 -0.90 # 与上一行C对比下降90% 5 A 2 0.00 # 与上一行A对比无变化
尝试将Label设为索引后再计算,结果仍不符合需求,因为索引改变不影响行的顺序,pct_change()还是按全局行序计算。
解决方案
使用groupby('Label')对DataFrame按Label分组,再对每组的Val1列应用pct_change(),即可实现组内独立计算:
df['Val1_change'] = df.groupby('Label')['Val1'].pct_change()
执行后查看结果:
print(df)
输出:
Label Val1 Val1_change 0 A 2 NaN 1 B 4 NaN 2 C 20 NaN 3 B 8 1.0 4 C 2 -0.9 5 A 2 0.0
原理说明
groupby('Label')将数据按Label值分成多个子组(A组、B组、C组)- 对每个子组的
Val1列调用pct_change(),会在组内按行的原始顺序计算与前一行的百分比变化 - 每个组的第一行没有前序同组数据,因此结果为
NaN,完全符合需求
内容的提问来源于stack exchange,提问作者Edy Bourne
相关产品推荐
相关产品推荐

