2016-12-13 184 views
2

假设我有数据帧(称为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 

如何?

回答

3

执行你的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

你可以把你的结果和移位 '量' 列在DF把它:

diff_df.quantity = diff_df.quantity/df.quantity.shift(1)