【发布时间】:2021-08-09 02:56:41
【问题描述】:
我有两个独立的数据框,代表不同类型的基于时间的数据。一个包含分布在几个月内的数十万个时间戳。此数据框具有代表一年中的月份、一天中的时间和测量温度的列。第二个数据框包含每个月/小时组合的替换温度。数据大致如下:
df1
| Timestamp | Month | Hour | Temperature |
|---|---|---|---|
| 1/1/2021 00:00:00 | 1 | 0 | 10 |
| 1/1/2021 00:00:05 | 1 | 0 | 11 |
| 1/1/2021 00:00:07 | 1 | 0 | 8 |
| 1/1/2021 00:00:15 | 1 | 0 | 12 |
| 1/1/2021 00:01:00 | 1 | 1 | 13 |
等等
df2
| Hour | Jan | Feb | Mar | Apr | etc |
|---|---|---|---|---|---|
| 0 | 9 | 12 | 10 | 12 | etc |
| 1 | 10 | 11 | 14 | 15 | etc |
| 2 | 8 | 7 | 12 | 16 | etc |
df2 包含一天中每个小时的行,以及一年中每个月的列(在真实数据集中,月份是数字,我写了名称以使描述清晰)。
我需要将 df2 中包含的月份/小时的数据映射到 df 1 中的温度列。所以 df1 编辑后应该如下所示。
新的 df1
| Timestamp | Month | Hour | Temperature |
|---|---|---|---|
| 1/1/2021 00:00:00 | 1 | 0 | 9 |
| 1/1/2021 00:00:05 | 1 | 0 | 9 |
| 1/1/2021 00:00:07 | 1 | 0 | 9 |
| 1/1/2021 00:00:15 | 1 | 0 | 9 |
| 1/1/2021 00:01:00 | 1 | 1 | 10 |
我已经使用嵌套的 for 循环使其工作,如下所示:
for month in df2.columns:
for hour in df2.index:
dT = df2.loc[hour, month]
df1.loc[(df1['Month'] == month) & (df1['Hour'] == hour), 'Temperature'] = dT
嵌套的 for 循环遍历 df2 中的所有月份和时间,找到 df1 中具有匹配月份和时间的单元格,然后将温度设置为等于从 df2 中读取的温度。
但是这段代码既难以阅读又执行起来超级慢。有人知道更好的方法吗??
谢谢!
【问题讨论】:
-
你能测试my answer 并给我关于运行时间的反馈吗?可以通过跳过提取月份名称的步骤并改用第二个数据框来加快速度。让我知道……