Pandas Average If in Python : 将 groupby 均值与条件语句相结合
Pandas Average If in Python : Combining groupby mean with conditional statement
我浏览了论坛,似乎无法解决这个问题。我有以下数据。我假设答案在于 "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”列。我希望此列为 PRIOR 3 对应的小时值生成 "Value" 列的平均值。 我想为整个系列填写此栏。例如,值 53.33 是 1 小时 1/2、1/3 和 1/4 的平均值。我希望这继续向下使用每个 "HourValue" 的前 3 个值。
此外,请注意有 1/5 小时 4 等实例。并非所有日期都具有相同的小时数,因此我正在寻找存在这些小时的日期的最后 3 小时值。
我希望这是有道理的。非常感谢您的帮助!
您可以 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
你可以试试滚动均值
df['3D Average'] = df.iloc[::-1].groupby('Hour').Value.rolling(window = 3).mean()\
.shift().sort_index(level = 1).values
我浏览了论坛,似乎无法解决这个问题。我有以下数据。我假设答案在于 "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”列。我希望此列为 PRIOR 3 对应的小时值生成 "Value" 列的平均值。 我想为整个系列填写此栏。例如,值 53.33 是 1 小时 1/2、1/3 和 1/4 的平均值。我希望这继续向下使用每个 "HourValue" 的前 3 个值。
此外,请注意有 1/5 小时 4 等实例。并非所有日期都具有相同的小时数,因此我正在寻找存在这些小时的日期的最后 3 小时值。
我希望这是有道理的。非常感谢您的帮助!
您可以 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
你可以试试滚动均值
df['3D Average'] = df.iloc[::-1].groupby('Hour').Value.rolling(window = 3).mean()\
.shift().sort_index(level = 1).values