2017-03-22 152 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