我有一个这样的数据框:
Time Name Value
2007Q1 A 30
2007Q2 A 35
2007Q3 A 28
...
2007Q1 B 31
2007Q2 B 50
2007Q3 B 60
...
2007Q1 C 20
2007Q2 C 15
2007Q3 C 30
我想添加另一列称为结果,并在每个名称的每一行之间执行计算。我要使用一个季度的值除以上一个季度的值再减去1,这与 Value(Q2)/ Value(Q1)-1 类似。另外,我想按名称分组,只在具有相同名称的行中进行计算。结果应为:
Time Name Value Results
2007Q1 A 30
2007Q2 A 35 0.1667
2007Q3 A 28 -0.2
...
2007Q1 B 31
2007Q2 B 50 0.6129
2007Q3 B 60 0.2
...
2007Q1 C 20
2007Q2 C 15 -0.25
2007Q3 C 30 1
每个“名称”的开始时间段的“结果”应该没有值。
感谢所有能提供帮助的人!
答案 0 :(得分:2)
在Name
上使用DataFrame.groupby
并使用groupby.shift
来移动列Value
,然后使用Series.div
将其除以Value
,最后使用Series.sub
减去1
:
df['Results'] = df['Value'].div(df.groupby('Name')['Value'].shift()).sub(1)
结果:
print(df)
Time Name Value Results
0 2007Q1 A 30 NaN
1 2007Q2 A 35 0.166667
2 2007Q3 A 28 -0.200000
3 2007Q1 B 31 NaN
4 2007Q2 B 50 0.612903
5 2007Q3 B 60 0.200000
6 2007Q1 C 20 NaN
7 2007Q2 C 15 -0.250000
8 2007Q3 C 30 1.000000