如何让合并生成的merged_data包含原DataFrame df的所有列?
解决merged_data缺失原df列的问题
你的代码只保留了从文件读取的Case相关列和folder_file_id,完全没关联原df的其他列(比如除File ID、File Name外的字段)。下面提供两种实用方案:
方案一:合并后关联原df(最简修改)
基于你现有代码,只需要加两步就能把原df的所有列带进来:
- 先给原df生成和代码中一致的
folder_file_id列:
df['folder_file_id'] = df['File ID'].str.strip() + '_' + df['File Name'].str.strip()
- 执行你原来的代码生成
merged_data后,用folder_file_id做关联键,把原df的列合并进去:
merged_data = merged_data.merge(df, on='folder_file_id', how='left')
这样最终的merged_data就会包含原df的全部列,加上从文件读取的各个Case列。
方案二:循环时直接携带原df列(更高效)
如果原df数据量较大,循环时直接把原df行信息和文件数据结合,避免后续的merge操作:
import pathlib import pandas as pd root_path = pathlib.Path('root') data_list = [] for count, (idx, row) in enumerate(df.iterrows(), 1): folder_name = row['File ID'].strip() file_name = row['File Name'].strip() file_path = root_path / folder_name / file_name folder_file_id = f'{folder_name}_{file_name}' # 读取文件数据 file_data = pd.read_csv(file_path, header=None, sep='\t', names=['Case', 'Value'], memory_map=True, low_memory=False) # 把原df当前行的所有列复制到file_data的每一行 file_data = file_data.assign(**row.to_dict(), folder_file_id=folder_file_id) data_list.append(file_data) print(count) # 合并数据并转成宽表,直接得到包含原df所有列的结果 merged_data = pd.concat(data_list).pivot_table( index=[col for col in df.columns] + ['folder_file_id'], columns='Case', values='Value', aggfunc='first' # 若同一Case有重复值,取第一个,可按需调整 ).reset_index()
注意事项
- 如果原df存在重复的
folder_file_id,需根据实际需求调整pivot_table的aggfunc参数(比如用mean取均值),或者提前对原df去重。 - 方案二中的
file_data.assign(**row.to_dict())可以快速把原df的所有列复制到文件数据中,比逐个列赋值更简洁。
内容的提问来源于stack exchange,提问作者DeepLearner123
相关产品推荐
相关产品推荐

