在给定的天数差异范围内对值进行求和 - 熊猫

时间:2017-10-01 08:41:33

标签: python pandas

我在pandas数据框中创建了一个天差栏,我希望在给定的日期窗口中向后添加一个具有特定值之和的列

请注意,如果需要,我可以为每一行提供日期列,但差异是从数据第一天的天数差异创建的。

实施例

df = pd.DataFrame.from_dict({'diff': [0,0,1,2,2,2,2,10,11,15,18],
                            'value': [10,11,15,2,5,7,8,9,23,14,15]})
df
Out[12]: 
    diff  value
0      0     10
1      0     11
2      1     15
3      2      2
4      2      5
5      2      7
6      2      8
7     10      9
8     11     23
9     15     14
10    18     15

我想添加5_days_back_sum列,它将总结过去5天,包括当天所以结果将是这样的

Out[15]: 
    5_days_back_sum  diff  value
0                21     0     10
1                21     0     11
2                36     1     15
3                58     2      2
4                58     2      5
5                58     2      7
6                58     2      8
7                 9    10      9
8                32    11     23
9                46    15     14
10               29    18     15

我怎样才能实现这一目标?最初我有一个日期列来创建diff列,如果这有助于它的可用

1 个答案:

答案 0 :(得分:3)

使用自定义功能boolean indexing进行sum的过滤范围:

def f(x):
    return df.loc[(df['diff'] >= x - 5) & (df['diff'] <= x), 'value'].sum()

df['5_days_back_sum'] = df['diff'].apply(f)
print (df)
    diff  value  5_days_back_sum
0      0     10               21
1      0     11               21
2      1     15               36
3      2      2               58
4      2      5               58
5      2      7               58
6      2      8               58
7     10      9                9
8     11     23               32
9     15     14               46
10    18     15               29

between类似的解决方案:

def f(x):
    return df.loc[df['diff'].between(x - 5, x), 'value'].sum()

df['5_days_back_sum'] = df['diff'].apply(f)
print (df)
    diff  value  5_days_back_sum
0      0     10               21
1      0     11               21
2      1     15               36
3      2      2               58
4      2      5               58
5      2      7               58
6      2      8               58
7     10      9                9
8     11     23               32
9     15     14               46
10    18     15               29