基于相同小时合并Pandas DataFrames:添加小时均值列问题
解决DataFrame按小时批量填充均值的问题
嘿,我来帮你搞定这个需求!其实用Pandas有好几种简单的方法可以实现,不管你是直接计算均值还是用已经得到的均值表,都能轻松关联匹配。
方法一:直接计算并填充(最省心,不用提前准备均值表)
如果还没提前算好各小时的均值,直接用groupby+transform就能一步到位,它会自动把每个小时的均值广播到对应小时的所有行:
import pandas as pd # 第一步:确保Timestamp列是datetime格式(如果还没转的话) df['Timestamp'] = pd.to_datetime(df['Timestamp']) # 第二步:提取每个时间戳的小时数 df['Hour'] = df['Timestamp'].dt.hour # 第三步:计算每个小时的均值,并填充到Average列 df['Average'] = df.groupby('Hour')['Value'].transform('mean')
transform的好处是不用额外生成中间表,直接在原DataFrame上添加结果,所有同一小时的行都会自动匹配到该小时的均值。
方法二:用已有的均值表关联匹配
如果你已经有了单独的小时均值表(假设表名叫hour_means,结构是Hour和Average两列),可以用这两种方式关联:
方式A:用merge合并表
# 先提取原数据的小时列 df['Hour'] = df['Timestamp'].dt.hour # 按Hour列合并两个表,把均值匹配过来 df = df.merge(hour_means, on='Hour', how='left')
how='left'保证原数据的所有行都能保留,不会因为没有匹配到小时而丢失数据。
方式B:用字典映射(更高效)
把均值表转成字典,然后用map快速匹配:
# 把均值表转成{小时: 均值}的字典 mean_dict = hour_means.set_index('Hour')['Average'].to_dict() # 直接通过小时数映射到均值 df['Average'] = df['Timestamp'].dt.hour.map(mean_dict)
这种方法速度更快,适合数据量比较大的情况。
举个实际例子
假设你的数据是这样的:
| Timestamp | Value |
|---|---|
| 2018-04-12 13:00:00 | 12.0 |
| 2018-04-12 12:00:00 | 38.0 |
| 2018-04-13 13:00:00 | 14.0 |
| 2018-04-13 12:00:00 | 36.0 |
用方法一处理后,结果会变成:
| Timestamp | Value | Hour | Average |
|---|---|---|---|
| 2018-04-12 13:00:00 | 12.0 | 13 | 13.0 |
| 2018-04-12 12:00:00 | 38.0 | 12 | 37.0 |
| 2018-04-13 13:00:00 | 14.0 | 13 | 13.0 |
| 2018-04-13 12:00:00 | 36.0 | 12 | 37.0 |
完全符合你要的“所有同一小时的行都填入该小时均值”的需求!
内容的提问来源于stack exchange,提问作者Benaiah2320
相关产品推荐
相关产品推荐

