熊猫汇总前滚动后删除重复项

时间:2019-01-27 11:42:52

标签: python pandas pandas-groupby

我有这个源数据帧。 我需要在x期间为唯一('level_two')密钥计算每个('level_one')密钥的'money'列的总和。 但是,我必须在另一个数据框中使用要计算的日期和在此数据集中求和时需要考虑的日期。

df1 = pd.DataFrame({
    'level_one': [1, 1, 1, 1, 2],
    'level_two': 'a a b b c'.split(),
    'money': [100, 100, 200, 200, 300],
    'date': [
        pd.Timestamp('2017-06-01'),
        pd.Timestamp('2017-06-01'),
        pd.Timestamp('2017-06-02'),
        pd.Timestamp('2017-06-03'),
        pd.Timestamp('2017-06-03')
    ]
})
这个“另一个”数据框包含我需要计算总和的日期。
df2 = pd.DataFrame({
    'level_one': [1, 1, 1, 1, 2, 2 ,2],
    'level_two': 'a b y d c f g'.split(),
    'date': [
        pd.Timestamp('2017-06-01'),
        pd.Timestamp('2017-06-03'),
        pd.Timestamp('2017-06-05'),
        pd.Timestamp('2017-06-06'),
        pd.Timestamp('2017-06-02'),
        pd.Timestamp('2017-06-03'),
        pd.Timestamp('2017-06-04')
    ]
})
我决定将df1和df2与外部join和ffill = 0对齐。结果数据框如下。
keys = ['level_one', 'level_two', 'date']

aligned = df1.set_index(keys).align(df2.set_index(keys), fill_value=0)[0]
aligned

                         date       money
     level_one level_two    
1              a         2017-06-01 100
1              a         2017-06-01 100
1              b         2017-06-02 200
1              b         2017-06-03 200
1              d         2017-06-06 0
1              y         2017-06-05 0
2              c         2017-06-02 0
2              c         2017-06-03 300
2              f         2017-06-03 0
2              g         2017-06-04 0
对齐的数据框看起来很酷。它包含所有日期和键。因此,我将在此处使用“滚动”操作并获得满意的结果,但“滚动”不能在“求和”操作之前通过键“ level_two”删除重复项。例如(见下文),在第三行我有200,但是它应该有100,因为前两行具有相同的“ level_two”键。
aligned.reset_index(
    level=['level_one', 'date']).groupby('level_one')['date', 'money'].rolling(
        '3D', closed='left', on='date').sum()

                         date       money
     level_one level_two    
1              a         2017-06-01 NaN
1              a         2017-06-01 100
1              b         2017-06-02 200
1              b         2017-06-03 400
1              d         2017-06-06 200
1              y         2017-06-05 200
2              c         2017-06-02 NaN
2              c         2017-06-03 0
2              f         2017-06-03 300
2              g         2017-06-04 300

我希望在3天内获得低于结果的结果。如何处理没有循环的任务?

                         date       money
     level_one level_two    
1              a         2017-06-01 NaN
1              a         2017-06-01 NaN
1              b         2017-06-02 100
1              b         2017-06-03 100
1              d         2017-06-06 200
1              y         2017-06-05 200
2              c         2017-06-02 NaN
2              c         2017-06-03 NaN
2              f         2017-06-03 300
2              g         2017-06-04 300

0 个答案:

没有答案