从子目录CSV构建DataFrame:列对应子目录的实现问题
解决多子目录CSV合并为DataFrame列的索引重复与NaN问题
我明白你遇到的问题了——你现在用pd.concat(inv)是把所有DataFrame按行堆叠,这就导致每个子目录的数据都被单独放在一段行里,同一日期会重复出现,其他列自然都是NaN,完全不符合你「每列对应一个子目录数据」的目标。咱们调整一下循环逻辑,换个思路来实现:
核心思路修正
- 先按子目录维度处理:每个子目录下的所有CSV属于同一列,先把它们合并成一个完整的Series
- 用字典存储每个子目录对应的Series(键为子目录名,值为合并后的Series)
- 最后将字典转换为DataFrame,自动按索引对齐所有列
修改后的完整代码
import os import pandas as pd rootdir = 'D:/Favorites/Michiel/Studie/Master/PV data/CSV/15min/DDW' yield_current_day = 'Energy Yield of Current Day (kWh)' # 用字典存储每个子目录的完整数据,键=子目录名,值=对应Series subdir_data_dict = {} for subdir, dirs, files in os.walk(rootdir): # 跳过根目录本身,只处理子目录 if subdir == rootdir: continue # 获取子目录名称(和你之前取最后3位的逻辑保持一致) subdir_name = str(subdir)[-3:] # 收集当前子目录下所有CSV的目标列数据 subdir_series_list = [] for file in files: file_path = os.path.join(subdir, file) # 读取CSV并提取目标列 df = pd.read_csv( file_path, encoding='UTF-16', header=1, sep='\t', index_col='Generated On', parse_dates=True ) subdir_series_list.append(df[yield_current_day]) # 合并当前子目录下的所有Series,排序索引并去重重复日期 merged_subdir_series = pd.concat(subdir_series_list).sort_index() # 去除重复索引(如果同一子目录下有重复日期的CSV,保留最后一条数据) merged_subdir_series = merged_subdir_series[~merged_subdir_series.index.duplicated(keep='last')] # 将合并后的Series存入字典 subdir_data_dict[subdir_name] = merged_subdir_series # 将字典转换为DataFrame,每个子目录对应一列 final_frame = pd.DataFrame(subdir_data_dict)
关键细节说明
- 为什么之前的方法失效?:原代码中
pd.concat(inv)默认是axis=0(行拼接),相当于把每个子目录的DataFrame依次叠在下面,所以会出现大量重复索引和NaN。现在用字典存储后转DataFrame,是按axis=1(列拼接),自动按索引对齐所有数据。 - 重复索引处理:如果同一子目录下的CSV有重复日期,用
~merged_subdir_series.index.duplicated()可以去除重复项,keep='last'表示保留最后一条数据,你可以根据需求改成'first'。 - NaN的合理性:如果某些日期在某个子目录没有数据,NaN是正常的;如果是不必要的NaN,可以用
final_frame.fillna(0)或者其他填充方式处理,具体取决于你的业务需求。
内容的提问来源于stack exchange,提问作者Michiel Bruinewoud
相关产品推荐
相关产品推荐

