如何将交错行合并为单列变量?循环合并CSV列错位问题求助
循环合并CSV时重复生成列、数据错位的解决方法
你当前的问题核心在于循环merge的逻辑错误:每次拿左表和单个CSV文件做合并,导致同类数值列因名称重复被自动添加_r后缀,且不同CSV里的state-year数据分散到不同列,最终呈现出数据错位、列重复的现象。
修正方案:先合并所有CSV为统一数据集,再与左表匹配
不要循环执行merge,先把目录下所有CSV文件合并成一个完整的数据集,再和左表做一次merge,这样同类数据会自动集中到同一列,且行对齐。
修改后的代码:
import os import pandas as pd directory_path = 'black_male_65up_unemp' left_dataset = dfpt2 # 统一处理左表的state为小写,仅执行一次即可 left_dataset['state'] = left_dataset['state'].str.lower() # 收集所有CSV处理后的数据 csv_data_list = [] for filename in os.listdir(directory_path): if filename.endswith(".csv"): csv_path = os.path.join(directory_path, filename) df = pd.read_csv(csv_path) # 处理右表:统一列名、删除冗余列 df['state'] = df['NAME'].str.lower() df.drop(columns=['GEOID', 'variable', 'Unnamed: 0', 'moe', 'NAME'], inplace=True) # 如果CSV里的数值列名称不统一,这里可添加重命名:df.rename(columns={'原列名': '统一列名'}, inplace=True) csv_data_list.append(df) # 将所有CSV数据合并为一个大DataFrame combined_csv_df = pd.concat(csv_data_list, ignore_index=True) # 最后一次merge,按state+year匹配对齐数据 left_dataset = pd.merge(left_dataset, combined_csv_df, how='left', on=['state', 'year']) left_dataset
关键修改说明
- 把左表
state转小写的操作移到循环外,避免重复执行浪费资源 - 每个CSV处理后将
NAME重命名为state并删除原列,统一匹配字段的列名 - 用
pd.concat把所有CSV数据合并成整体,同类数值列会自动集中到同一列 - 仅执行一次merge,数据会按
state+year自动对齐,不会生成重复的_r后缀列
内容的提问来源于stack exchange,提问作者Kareem Weaver
相关产品推荐
相关产品推荐

