假设我有DataFrame(名为df
)
'name' 'order' 'quantity'
'A' 1 10
'A' 2 15
'A' 3 5
'B' 1 2
'B' 2 6
我想要的是构建另一个数据框,其中包含一个列,其中连续列的差异(按列order
连续)与第一个值的比率。
我很容易将所述比率(分子)的差异检索为
def compute_diff(x):
quantity_diff = x.quantity.diff()
return quantity_diff
diff_df = df.sort_values('order').groupby('name').apply(compute_diff).reset_index(name='diff')
这给了我
'name' 'level_1' 'quantity'
'A' 0 NaN
'A' 1 5
'A' 1 -10
'B' 1 NaN
'B' 2 4
现在我想要比例,根据描述。具体来说,我想要
'name' 'level_1' 'quantity'
'A' 1 NaN
'A' 2 0.5
'A' 3 -0.6666
'B' 1 NaN
'B' 2 2
如何?
答案 0 :(得分:4)
执行groupby
后,请使用pct_change
:
# Sort the DataFrame, if necessary.
df = df.sort_values(['name', 'order'])
# Use groupby and pcnt_change on the 'quantity' column.
df['quantity'] = df.groupby('name')['quantity'].pct_change()
结果输出:
name order quantity
0 A 1 NaN
1 A 2 0.500000
2 A 3 -0.666667
3 B 1 NaN
4 B 2 2.000000
答案 1 :(得分:1)
您可以将结果除以df中的移位'数量'列:
diff_df.quantity = diff_df.quantity / df.quantity.shift(1)