Pandas Average If在Python中:将groupby与条件语句结合起来

时间:2018-03-22 18:21:56

标签: python pandas conditional trailing

我已经浏览了论坛,似乎无法解决这个问题。我有以下数据。我假设答案在于" groupby"功能,但我似乎无法解决。

Date     Hour    Value   3DAverage
1/1       1       57      53.33
1/1       2       43      42.33
1/1       3       44      45.33
1/2       1       51      ...
1/2       2       40      ...
1/2       3       42      ...
1/3       1       56      ...
1/3       2       42
1/3       3       48
1/4       1       53
1/4       2       45
1/4       3       46
1/5       1       56
1/5       2       46
1/5       3       48
1/5       4       64 *       
1/6       1       50
1/6       2       41
1/6       3       42
1/7       1       57
1/7       2       43
1/7       3       45
1/8       1       58
1/8       2       49
1/8       3       41
1/9       1       53
1/9       2       46
1/9       3       47
1/10      1       58
1/10      2       49
1/10      3       40

我要做的是添加" 3DAverage"柱。我希望这个专栏能够产生" Value"的平均值。 PRIOR 3对应小时值的列。 我想在整个系列中填写此列。例如,值53.33是1/2,1/3和1/4上小时1的值的平均值。我希望这只使用每个" HourValue"的前3个值继续向下。

此外,请注意有1/5小时等实例4.并非所有日期都具有相同的小时数,因此我正在寻找这些小时数存在的日期的最后3小时值。

我希望这是有道理的。非常感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您可以尝试滚动平均值

df['3D Average'] = df.iloc[::-1].groupby('Hour').Value.rolling(window = 3).mean()\
.shift().sort_index(level = 1).values

答案 1 :(得分:1)

您可以在日期列上groupby并执行以下操作:

df['3DAverage'] = df['Hour'].map(df.groupby('Hour').apply(lambda x: x.loc[x['Date'].isin(['1/2','1/3','1/4']),'Value'].mean()))

df.head(6)

   Date   Hour Value 3DAverage
0   1/1     1   57   53.333333
1   1/1     2   43   42.333333
2   1/1     3   44   45.333333
3   1/2     1   51   53.333333
4   1/2     2   40   42.333333
5   1/2     3   42   45.333333