如何基于日期条件从另一DataFrame创建新列并匹配异构数据集
解决跨结构数据集合并问题的实操方案
核心思路
先把宽格式的火灾数据集转成「年-月-火灾数」的长格式,再从目标数据集的日期中提取年、月作为匹配键,最后通过年、月关联两个数据集,自动实现重复日期对应重复火灾数的效果。
具体步骤(基于Python Pandas)
1. 转换火灾数据集格式(宽→长)
假设你的火灾数据集是类似这样的宽格式(月份为行,年份为列):
| 月份 | 2020 | 2021 | 2022 |
|---|---|---|---|
| 1 | 10 | 15 | 8 |
| 2 | 5 | 7 | 12 |
用melt函数将其转成长格式,方便后续匹配:
import pandas as pd # 替换成你的火灾数据集读取代码,比如pd.read_excel("fire_data.xlsx") fire_df = pd.DataFrame({ "月份": [1, 2, 3], "2020": [10, 5, 8], "2021": [15, 7, 10], "2022": [8, 12, 15] }) # 宽转长,生成年份、月份、火灾数三列 fire_long = fire_df.melt( id_vars="月份", var_name="年份", value_name="nr_total_queimadas" ) # 将年份转为整数类型,避免字符串匹配问题 fire_long["年份"] = fire_long["年份"].astype(int)
2. 从目标数据集提取匹配键
从data_medicao列中提取年、月,作为和火灾数据集关联的依据:
# 替换成你的目标数据集读取代码 target_df = pd.DataFrame({ "data_medicao": ["2020-01-05", "2020-01-10", "2021-02-03", "2022-03-15"] }) # 解析日期并提取年、月 target_df["年份"] = pd.to_datetime(target_df["data_medicao"]).dt.year target_df["月份"] = pd.to_datetime(target_df["data_medicao"]).dt.month
3. 合并两个数据集
通过merge函数按年、月关联,自动为每个重复日期匹配对应火灾数:
# 左连接保留目标数据集的所有行,即使没有对应火灾数据也会显示NaN result_df = pd.merge( target_df, fire_long, on=["年份", "月份"], how="left" ) # 清理中间生成的年份、月份列(按需保留) result_df = result_df.drop(["年份", "月份"], axis=1)
为什么不用循环?
Pandas的内置函数(melt/merge)是为批量数据处理优化的,效率远高于手动循环,且能避免循环中容易出现的索引错误、匹配遗漏问题,完全满足你「重复日期对应重复火灾数」的需求。
如果你的数据集有特殊格式(比如月份是英文缩写、日期格式不规范),可以调整日期解析参数,比如用pd.to_datetime(..., format="%Y-%b-%d")来适配英文月份。
内容的提问来源于stack exchange,提问作者Alysson Drews
相关产品推荐
相关产品推荐

