基于日期与站点ID合并Excel表并跳过NaN值的Python实现问题
问题描述
- 现有两个数据文件:
- 因变量Excel文件:以
Date为DataFrame索引,Station ID为表头,存储各站点对应日期的监测值 - 自变量CSV文件:日期拆分为年、月、日三列,需匹配对应站点和日期的因变量值
- 因变量Excel文件:以
- 核心需求:
- 跳过因变量表中的NaN值
- 基于相同日期+Station ID,将因变量值匹配添加到自变量表中
问题分析
你当前代码中手动嵌套循环处理NaN、转numpy数组的方式,会丢失DataFrame的索引和列信息,反而增加匹配难度。Pandas内置了高效的数据清洗与合并工具,完全可以替代手动循环完成需求。
解决方案步骤
1. 读取并预处理数据集
- 读取因变量Excel时,保留
Date作为索引,表头的Station ID作为列 - 读取自变量CSV时,将年、月、日三列合并为标准日期格式列,保证与因变量表的日期格式统一
2. 重塑因变量数据格式
因变量表是宽格式(Station ID为列),需转成长格式(每行对应一个日期+站点的有效组合),此操作会自动过滤NaN值,同时让数据结构与自变量表对齐。
3. 合并两个数据集
使用Pandas的merge函数,基于日期和Station ID两个字段精准匹配,将因变量值添加到自变量表中。
完整代码
import pandas as pd import numpy as np # ---------------------- 1. 读取数据 ---------------------- # 读取因变量Excel:Date为索引,Station ID为表头 path = 'F:/72hourtimewindow/project/waterqualitydate/29UMT/' df_dep = pd.read_excel(path+'Stationwithorder.xls', header=0, index_col=0) # 读取自变量CSV:合并年、月、日为日期列 df_indep = pd.read_csv('GEEdownload.csv') # 注意:如果自变量表的年/月/日列名不是'year'/'month'/'day',请替换为实际列名 df_indep['Date'] = pd.to_datetime(df_indep[['year', 'month', 'day']]) # ---------------------- 2. 重塑因变量数据并过滤NaN ---------------------- # 宽格式转长格式,自动丢弃NaN值 df_dep_long = df_dep.stack().reset_index() # 重命名列名,方便后续合并 df_dep_long.columns = ['Date', 'Station ID', '因变量值'] # ---------------------- 3. 合并两个数据集 ---------------------- # 基于Date和Station ID匹配,保留自变量表所有行,匹配到的填充因变量值 final_df = pd.merge(df_indep, df_dep_long, on=['Date', 'Station ID'], how='left') # 查看结果 print(final_df.head()) # 保存匹配后的数据集 final_df.to_csv('匹配后的数据集.csv', index=False)
关键代码说明
df_dep.stack():将宽格式的因变量表转成长格式,自动跳过所有NaN值,只保留有效数据pd.to_datetime(df_indep[['year', 'month', 'day']]):将拆分的日期列合并为标准日期格式,确保与因变量表的日期能精准匹配pd.merge(..., how='left'):保留自变量表的所有行,匹配成功的行填充因变量值,未匹配到的显示NaN;若只需保留匹配成功的行,可将how='left'改为how='inner'
内容的提问来源于stack exchange,提问作者Minyan Zhao
相关产品推荐
相关产品推荐

