如何将两个CSV文件数据合并至土壤样本主文件并确保数据匹配对应行?
土壤样本数据匹配合并解决方案
依赖准备
先确保安装了pandas(处理CSV的首选工具库):
pip install pandas
核心代码(可直接复用)
下面的代码支持手动指定样本编号列名、自定义列映射,会自动匹配样本并填充数据,同时保留主文件的所有原始行:
import pandas as pd # -------------------------- # 手动配置区(根据你的实际情况修改) # -------------------------- MAIN_CSV_PATH = "main_soil_samples.csv" # 主文件路径 LAB_CSV_PATH = "lab_analysis_data.csv" # 实验室数据文件路径 MAIN_SAMPLE_COL = "Sample_Coord_ID" # 主文件的样本编号列名 LAB_SAMPLE_COL = "Sample_Ref_No" # 实验室文件的样本编号列名 # 手动列映射:实验室列名 → 主文件目标列名(不需要匹配的列可以不写) COLUMN_MAPPING = { "Total_Nitrogen": "总氮含量", "Available_P": "有效磷含量", "Soil_pH": "土壤pH", "Organic_Matter": "有机质含量" } OUTPUT_PATH = "merged_soil_data.csv" # 合并后的输出文件路径 # -------------------------- # 数据处理逻辑 # -------------------------- # 读取两个CSV文件 main_df = pd.read_csv(MAIN_CSV_PATH) lab_df = pd.read_csv(LAB_CSV_PATH) # 重命名实验室数据的列(按照手动映射) lab_df_renamed = lab_df.rename(columns=COLUMN_MAPPING) # 保留实验室数据中需要的列:样本编号列 + 已重命名的分析列 keep_cols = [LAB_SAMPLE_COL] + list(COLUMN_MAPPING.values()) lab_df_filtered = lab_df_renamed[keep_cols] # 匹配合并数据:以主文件为基准,按样本编号匹配 merged_df = pd.merge( main_df, lab_df_filtered, left_on=MAIN_SAMPLE_COL, right_on=LAB_SAMPLE_COL, how="left" # 保留主文件所有行,未匹配到的分析列会显示NaN ) # 移除冗余的实验室样本编号列(如果不需要保留) merged_df = merged_df.drop(columns=[LAB_SAMPLE_COL]) # 检查未匹配的样本(可选,方便排查) unmatched_samples = main_df[~main_df[MAIN_SAMPLE_COL].isin(lab_df[LAB_SAMPLE_COL])] if not unmatched_samples.empty: print(f"注意:以下样本未找到匹配的实验室数据:\n{unmatched_samples[MAIN_SAMPLE_COL].tolist()}") # 保存合并后的文件 merged_df.to_csv(OUTPUT_PATH, index=False, encoding="utf-8-sig") print(f"合并完成,结果已保存至 {OUTPUT_PATH}")
使用说明
- 修改手动配置区的所有参数,确保路径、列名和映射关系和你的实际文件一致
- 运行代码后,未匹配到实验室数据的样本,对应分析列会显示
NaN,同时控制台会打印未匹配的样本编号 - 输出的CSV文件会保留主文件的所有原始列,同时添加匹配后的分析数据列
内容的提问来源于stack exchange,提问作者Matthew Healey
相关产品推荐
相关产品推荐

