如何用Pandas从多CSV提取对应行生成新文件?代码仅首行有效排错
问题解析:CSV多行提取仅首行成功其余为NaN的原因与修复方案
问题场景回顾
你需要处理10个CSV文件,目标是将所有文件的第1行汇总保存为一个新CSV,第2行汇总保存为第二个新CSV,以此类推。但目前编写的代码仅能提取首行,其余行都显示NaN,我们来一步步拆解问题所在。
代码错误分析
先看你当前代码的核心问题:
- 逻辑完全偏离需求:你创建了一个单DataFrame(
dfcsv),但你的需求是生成多个CSV文件(每个对应原文件某一行的汇总),两者的目标结构完全不匹配。 - 循环赋值逻辑错误:在遍历文件的循环中,你始终只给
dfcsv.iloc[0]赋值——这意味着每处理一个文件,你都会覆盖掉之前文件的首行数据,最后dfcsv的第一行只会保留最后一个文件的首行,而其他行从未被赋值,自然全是NaN。 - 未实现多行汇总逻辑:代码完全没有遍历原文件的每一行,也没有收集所有文件对应行的数据,根本没触达到“每行汇总”的核心需求。
修复后的代码实现
下面是符合你需求的完整代码,注释里会说明每一步的作用:
import pandas as pd import glob path = r'/Jupyter_Works/new_csv' all_files = glob.glob(path + "/*.csv") # 1. 先读取所有CSV文件,存储到列表中统一管理 dfs_list = [] for filename in all_files: # 按原方式读取,保留time作为索引 df = pd.read_csv(filename, index_col='time', header=0) dfs_list.append(df) # 2. 校验所有文件的行数是否一致(避免汇总时出错) if not all(len(df) == len(dfs_list[0]) for df in dfs_list): raise ValueError("所有输入CSV文件的行数必须完全一致!") # 3. 遍历每一行索引,汇总所有文件的对应行并保存为独立CSV total_rows = len(dfs_list[0]) # 复用你定义的列名 columns = ['Lat','Lon','Alt','Temperature','Relative Humidity','Wind speed','Wind direction','Short-wave irradiation'] for row_idx in range(total_rows): # 收集所有文件的第row_idx行数据 combined_rows = [df.iloc[row_idx] for df in dfs_list] # 将收集到的行转为DataFrame combined_df = pd.DataFrame(combined_rows, columns=columns) # 保存为CSV,文件名可以按行号命名(比如combined_row_0.csv对应所有文件的第1行) combined_df.to_csv(f'{path}/combined_row_{row_idx}.csv', index=False)
额外优化建议
- 如果你的CSV文件的
time索引是标准时间格式,也可以通过索引值来匹配行(而不是行号),这样能避免因为文件行顺序不一致导致的错误,比如:# 按时间戳提取对应行 target_time = dfs_list[0].index[row_idx] combined_rows = [df.loc[target_time] for df in dfs_list] - 如果存在行数不一致的文件,可以根据需求选择跳过、补全
NaN或截断行,保证汇总逻辑的稳定性。
内容的提问来源于stack exchange,提问作者HMadadi
相关产品推荐
相关产品推荐

