2017-03-22 191 views
1

試想一個熊貓數據幀像這樣熊貓累計條件的總和

 date id initial_value part_value 
2016-01-21 1   100   10 
2016-05-18 1   100   20 
2016-03-15 2   150   75 
2016-07-28 2   150   50 
2016-08-30 2   150   25 
2015-07-21 3    75   75 

與以下

df = pd.DataFrame({ 
    'id': (1, 1, 2, 2, 2, 3), 
    'date': tuple(pd.to_datetime(date) for date in 
        ('2016-01-21', '2016-05-18', '2016-03-15', '2016-07-28', '2016-08-30', '2015-07-21')), 
    'initial_value': (100, 100, 150, 150, 150, 75), 
    'part_value': (10, 20, 75, 50, 25, 75)}).sort_values(['id', 'date']) 

我希望由initial_value減去累計總和定義的剩餘價值增加一列生成的part_value條件的ID和日期之前。因此,我希望我的目標是

 date id initial_value part_value goal 
2016-01-21 1   100   10 100 
2016-05-18 1   100   20 90 
2016-03-15 2   150   75 150 
2016-07-28 2   150   50 75 
2016-08-30 2   150   25 25 
2015-07-21 3    75   75 75 

我想一個解決方案可以通過從herehere的解決方案相結合進行,但我不完全弄明白。

+0

你能解釋更多'日期之前嗎?如果日期沒有排序,輸出是不同的? – jezrael

+0

你理解正確。排序問題 –

+0

好的,首先需要排序值?或值被排序? – jezrael

回答

2

如果不使用dates值需要addsubgroupbycumsum

df['goal'] = df.initial_value.add(df.part_value).sub(df.groupby('id').part_value.cumsum()) 
print (df) 
     date id initial_value part_value goal 
0 2016-01-21 1   100   10 100 
1 2016-05-18 1   100   20 90 
2 2016-03-15 2   150   75 150 
3 2016-07-28 2   150   50 75 
4 2016-08-30 2   150   25 25 
5 2015-07-21 3    75   75 75 

什麼是一樣的:

df['goal'] = df.initial_value + df.part_value - df.groupby('id').part_value.cumsum() 
print (df) 
     date id initial_value part_value goal 
0 2016-01-21 1   100   10 100 
1 2016-05-18 1   100   20 90 
2 2016-03-15 2   150   75 150 
3 2016-07-28 2   150   50 75 
4 2016-08-30 2   150   25 25 
5 2015-07-21 3    75   75 75 
+0

甚至:'(df.initial_value - df.groupby('id')。part_value.shift(1).fillna(0))。astype(int)'? –

+0

是的,在4個索引中有值的問題 - '100'而不是'25' – jezrael

+0

啊......好點 - 不理我:) –

0

其實我有一個解決方案提出了自己的好。我猜這是發生的一樣。

df['goal'] = df.initial_value - ((df.part_value).groupby(df.id).cumsum() - df.part_value) 
df 
     date id initial_value part_value goal 
0 2016-01-21 1   100   10 100 
1 2016-05-18 1   100   20 90 
2 2016-03-15 2   150   75 150 
3 2016-07-28 2   150   50 75 
4 2016-08-30 2   150   25 25 
5 2015-07-21 3    75   75 75