在接下来的n行中的更复杂的滚动总和

时间:2018-04-16 11:58:04

标签: python pandas dataframe

我有以下数据框:

print(df)
  day     month    year    quantity    
   6       04      2018       10
   8       04      2018        8
  12       04      2018        8

我想在下一个“n”天创建“数量”列总和,如下所示:

n = 2

print(df1)
  day     month    year    quantity  final_quantity    
   6       04      2018       10     10 + 0 + 8 = 18
   8       04      2018        8      8 + 0 + 0 = 8
  12       04      2018        8      8 + 0 + 0 = 8

具体而言,如果产品在接下来的“n”天内已售出,则总结 0 。 我尝试从Pandas滚动总和,但似乎不适用于不同的列:

n = 2
df.quantity[::-1].rolling(n + 1, min_periods=1).sum()[::-1]

2 个答案:

答案 0 :(得分:1)

您可以使用列表理解:

import pandas as pd

df['DateTime'] = pd.to_datetime(df[['year', 'month', 'day']])

df['final_quantity'] = [df.loc[df['DateTime'].between(d, d+pd.Timedelta(days=2)), 'quantity'].sum() \
                        for d in df['DateTime']]

print(df)

#    day  month  year  quantity   DateTime  final_quantity
# 0    6      4  2018        10 2018-04-06              18
# 1    8      4  2018         8 2018-04-08               8
# 2   12      4  2018         8 2018-04-12               8

答案 1 :(得分:1)

您可以将set_indexrollingsum

一起使用
df_out = df.set_index(pd.to_datetime(df['month'].astype(str)+
                            df['day'].astype(str)+
                            df['year'].astype(str), format='%m%d%Y'))['quantity']
d1 = df_out.resample('D').asfreq(fill_value=0)
d2 = d1[::-1].reset_index()
df['final_quantity'] = d2['quantity'].rolling(3, min_periods=1).sum()[::-1].to_frame()\
                                     .set_index(d1.index)\
                                     .reindex(df_out.index).values

输出:

   day  month  year  quantity  final_quantity
0    6      4  2018        10            18.0
1    8      4  2018         8             8.0
2   12      4  2018         8             8.0