获取 DateTimeIndex 周期的平均值,然后将它们重新分配到原始数据框列
Get averages for DateTimeIndex periods, then re-distribute them to the original dataframe column
我有一个可爱的代码,可以列出给定时间索引周期内所有条目的平均值。例如,在一个包含十年数据的数据框中,它将 return 一周中每一天的平均值。我想要做的是以尽可能少的行将这些平均值传播回整个数据帧。
我对计算平均值的代码感到相当自豪。例如,取一个包含此数据的数据框(为了方便起见,我列出 "day of week" 因为此值隐含在 datetimeindex 中,而此列在我自己的数据中不存在):
Datetimeindex day of week value
2019-01-01 3 60
2019-01-02 4 46
2019-01-03 5 72
2019-01-04 6 16
2019-01-05 7 94
2019-01-06 1 100
2019-01-07 2 41
2019-01-08 3 63
2019-01-09 4 3
2019-01-10 5 52
2019-01-11 6 38
2019-01-12 7 43
2019-01-13 1 22
2019-01-14 2 73
2019-01-15 3 72
2019-01-16 4 30
2019-01-17 5 52
2019-01-18 6 25
2019-01-19 7 28
2019-01-20 1 83
2019-01-21 2 98
2019-01-22 3 9
2019-01-23 4 61
2019-01-24 5 88
2019-01-25 6 54
2019-01-26 7 32
2019-01-27 1 32
2019-01-28 2 41
2019-01-29 3 65
2019-01-30 4 24
2019-01-31 5 92
2019-02-01 6 76
2019-02-02 7 47
2019-02-03 1 80
2019-02-04 2 62
我的代码是这样的:
result = time_series.groupby(time_series.index.weekday).mean()
这为我提供了一周中每一天的平均值的 len(7) 向量,如下所示:
day of week mean
1 63.4
2 63
3 53.8
4 32.8
5 71.2
6 41.8
7 48.8
我只想反转公式并将平均值粘贴回原始源数据框中。以上面的例子为例,期望的结果是:
Datetimeindex value
2019-01-01 53.8
2019-01-02 32.8
2019-01-03 71.2
2019-01-04 41.8
2019-01-05 48.8
2019-01-06 63.4
2019-01-07 63
2019-01-08 52.56
2019-01-09 30.16
2019-01-10 71.04
2019-01-11 46.96
2019-01-12 39.76
2019-01-13 63.4
2019-01-14 63
2019-01-15 52.56
2019-01-16 30.16
2019-01-17 71.04
2019-01-18 46.96
2019-01-19 39.76
2019-01-20 63.4
2019-01-21 63
2019-01-22 52.56
2019-01-23 30.16
2019-01-24 71.04
2019-01-25 46.96
2019-01-26 39.76
2019-01-27 63.4
2019-01-28 63
2019-01-29 52.56
2019-01-30 30.16
2019-01-31 71.04
2019-02-01 46.96
2019-02-02 39.76
2019-02-03 63.4
2019-02-04 63
感觉应该可以简单的把原来的公式倒过来说:
time_series.groupby(time_series.index.weekday) = result
但这显然行不通。或者即使可以就地执行 mean() 过程,例如:
result = time_series.groupby(time_series.index.weekday).mean(inplace=True)
或
result.loc[result.groupby(by=val)] = time_series.groupby(by=val).mean().values
但都不起作用。我很想用单线来做这件事,我觉得很接近,但我就是做不到。你有什么想法吗?
IIUC,这应该可行
result = time_series.groupby('day of week')['value'].transform('mean')
正在调用 df
到您的数据框:
Datetimeindex day_of_week value
2019-01-01 3 60
2019-01-02 4 46
2019-01-03 5 72
2019-01-04 6 16
2019-01-05 7 94
2019-01-06 1 100
2019-01-07 2 41
2019-01-08 3 63
2019-01-09 4 3
2019-01-10 5 52
2019-01-11 6 38
2019-01-12 7 43
2019-01-13 1 22
2019-01-14 2 73
2019-01-15 3 72
2019-01-16 4 30
2019-01-17 5 52
2019-01-18 6 25
2019-01-19 7 28
2019-01-20 1 83
2019-01-21 2 98
2019-01-22 3 9
2019-01-23 4 61
2019-01-24 5 88
2019-01-25 6 54
2019-01-26 7 32
2019-01-27 1 32
2019-01-28 2 41
2019-01-29 3 65
2019-01-30 4 24
2019-01-31 5 92
2019-02-01 6 76
2019-02-02 7 47
2019-02-03 1 80
2019-02-04 2 62
使用:
df2=df.replace(df.groupby('day_of_week')['value'].mean())['day_of_week'].to_frame().rename(columns={'day_of_week':'value'})
输出:
print(df2)
value
Datetimeindex
2019-01-01 53.8
2019-01-02 32.8
2019-01-03 71.2
2019-01-04 41.8
2019-01-05 48.8
2019-01-06 63.4
2019-01-07 63.0
2019-01-08 53.8
2019-01-09 32.8
2019-01-10 71.2
2019-01-11 41.8
2019-01-12 48.8
2019-01-13 63.4
2019-01-14 63.0
2019-01-15 53.8
2019-01-16 32.8
2019-01-17 71.2
2019-01-18 41.8
2019-01-19 48.8
2019-01-20 63.4
2019-01-21 63.0
2019-01-22 53.8
2019-01-23 32.8
2019-01-24 71.2
2019-01-25 41.8
2019-01-26 48.8
2019-01-27 63.4
2019-01-28 63.0
2019-01-29 53.8
2019-01-30 32.8
2019-01-31 71.2
2019-02-01 41.8
2019-02-02 48.8
2019-02-03 63.4
2019-02-04 63.0
在这种情况下使用 transform
和 groupby:
time_series.groupby(time_series.index.weekday)['value'].transform('mean')
2019-01-01 53.8
2019-01-02 32.8
2019-01-03 71.2
2019-01-04 41.8
2019-01-05 48.8
2019-01-06 63.4
2019-01-07 63.0
2019-01-08 53.8
2019-01-09 32.8
2019-01-10 71.2
2019-01-11 41.8
2019-01-12 48.8
2019-01-13 63.4
2019-01-14 63.0
......
.....
我有一个可爱的代码,可以列出给定时间索引周期内所有条目的平均值。例如,在一个包含十年数据的数据框中,它将 return 一周中每一天的平均值。我想要做的是以尽可能少的行将这些平均值传播回整个数据帧。
我对计算平均值的代码感到相当自豪。例如,取一个包含此数据的数据框(为了方便起见,我列出 "day of week" 因为此值隐含在 datetimeindex 中,而此列在我自己的数据中不存在):
Datetimeindex day of week value
2019-01-01 3 60
2019-01-02 4 46
2019-01-03 5 72
2019-01-04 6 16
2019-01-05 7 94
2019-01-06 1 100
2019-01-07 2 41
2019-01-08 3 63
2019-01-09 4 3
2019-01-10 5 52
2019-01-11 6 38
2019-01-12 7 43
2019-01-13 1 22
2019-01-14 2 73
2019-01-15 3 72
2019-01-16 4 30
2019-01-17 5 52
2019-01-18 6 25
2019-01-19 7 28
2019-01-20 1 83
2019-01-21 2 98
2019-01-22 3 9
2019-01-23 4 61
2019-01-24 5 88
2019-01-25 6 54
2019-01-26 7 32
2019-01-27 1 32
2019-01-28 2 41
2019-01-29 3 65
2019-01-30 4 24
2019-01-31 5 92
2019-02-01 6 76
2019-02-02 7 47
2019-02-03 1 80
2019-02-04 2 62
我的代码是这样的:
result = time_series.groupby(time_series.index.weekday).mean()
这为我提供了一周中每一天的平均值的 len(7) 向量,如下所示:
day of week mean
1 63.4
2 63
3 53.8
4 32.8
5 71.2
6 41.8
7 48.8
我只想反转公式并将平均值粘贴回原始源数据框中。以上面的例子为例,期望的结果是:
Datetimeindex value
2019-01-01 53.8
2019-01-02 32.8
2019-01-03 71.2
2019-01-04 41.8
2019-01-05 48.8
2019-01-06 63.4
2019-01-07 63
2019-01-08 52.56
2019-01-09 30.16
2019-01-10 71.04
2019-01-11 46.96
2019-01-12 39.76
2019-01-13 63.4
2019-01-14 63
2019-01-15 52.56
2019-01-16 30.16
2019-01-17 71.04
2019-01-18 46.96
2019-01-19 39.76
2019-01-20 63.4
2019-01-21 63
2019-01-22 52.56
2019-01-23 30.16
2019-01-24 71.04
2019-01-25 46.96
2019-01-26 39.76
2019-01-27 63.4
2019-01-28 63
2019-01-29 52.56
2019-01-30 30.16
2019-01-31 71.04
2019-02-01 46.96
2019-02-02 39.76
2019-02-03 63.4
2019-02-04 63
感觉应该可以简单的把原来的公式倒过来说:
time_series.groupby(time_series.index.weekday) = result
但这显然行不通。或者即使可以就地执行 mean() 过程,例如:
result = time_series.groupby(time_series.index.weekday).mean(inplace=True)
或
result.loc[result.groupby(by=val)] = time_series.groupby(by=val).mean().values
但都不起作用。我很想用单线来做这件事,我觉得很接近,但我就是做不到。你有什么想法吗?
IIUC,这应该可行
result = time_series.groupby('day of week')['value'].transform('mean')
正在调用 df
到您的数据框:
Datetimeindex day_of_week value
2019-01-01 3 60
2019-01-02 4 46
2019-01-03 5 72
2019-01-04 6 16
2019-01-05 7 94
2019-01-06 1 100
2019-01-07 2 41
2019-01-08 3 63
2019-01-09 4 3
2019-01-10 5 52
2019-01-11 6 38
2019-01-12 7 43
2019-01-13 1 22
2019-01-14 2 73
2019-01-15 3 72
2019-01-16 4 30
2019-01-17 5 52
2019-01-18 6 25
2019-01-19 7 28
2019-01-20 1 83
2019-01-21 2 98
2019-01-22 3 9
2019-01-23 4 61
2019-01-24 5 88
2019-01-25 6 54
2019-01-26 7 32
2019-01-27 1 32
2019-01-28 2 41
2019-01-29 3 65
2019-01-30 4 24
2019-01-31 5 92
2019-02-01 6 76
2019-02-02 7 47
2019-02-03 1 80
2019-02-04 2 62
使用:
df2=df.replace(df.groupby('day_of_week')['value'].mean())['day_of_week'].to_frame().rename(columns={'day_of_week':'value'})
输出:
print(df2)
value
Datetimeindex
2019-01-01 53.8
2019-01-02 32.8
2019-01-03 71.2
2019-01-04 41.8
2019-01-05 48.8
2019-01-06 63.4
2019-01-07 63.0
2019-01-08 53.8
2019-01-09 32.8
2019-01-10 71.2
2019-01-11 41.8
2019-01-12 48.8
2019-01-13 63.4
2019-01-14 63.0
2019-01-15 53.8
2019-01-16 32.8
2019-01-17 71.2
2019-01-18 41.8
2019-01-19 48.8
2019-01-20 63.4
2019-01-21 63.0
2019-01-22 53.8
2019-01-23 32.8
2019-01-24 71.2
2019-01-25 41.8
2019-01-26 48.8
2019-01-27 63.4
2019-01-28 63.0
2019-01-29 53.8
2019-01-30 32.8
2019-01-31 71.2
2019-02-01 41.8
2019-02-02 48.8
2019-02-03 63.4
2019-02-04 63.0
在这种情况下使用 transform
和 groupby:
time_series.groupby(time_series.index.weekday)['value'].transform('mean')
2019-01-01 53.8
2019-01-02 32.8
2019-01-03 71.2
2019-01-04 41.8
2019-01-05 48.8
2019-01-06 63.4
2019-01-07 63.0
2019-01-08 53.8
2019-01-09 32.8
2019-01-10 71.2
2019-01-11 41.8
2019-01-12 48.8
2019-01-13 63.4
2019-01-14 63.0
......
.....