Python多CSV文件提取指定列中间行并合并为DataFrame
解决方案
核心问题分析
- iloc提取无数据:大概率是列索引或行索引计算错误。注意
header=None时pandas列索引从0开始,第6列对应索引5,而非6;另外中间行的起始/结束位置计算逻辑缺失,直接提取会导致范围错误。 - 合并列到单一DataFrame:需要提前初始化空DataFrame,遍历过程中将每个文件的提取结果作为新列加入,列名建议用文件名区分。
修正后的完整代码
import pandas as pd import os import glob # 获取所有CSV文件路径 csv_files = glob.glob(os.path.join('filepath/', "*.csv")) # 初始化空DataFrame用于存储最终结果 final_df = pd.DataFrame() for f in csv_files: # 读取CSV,无表头 df = pd.read_csv(f, header=None) # 获取第6列(注意:pandas列索引从0开始,第6列对应索引5) target_col = df.iloc[:, 5] # 计算中间2000行的起始和结束索引 total_rows = len(target_col) # 确保至少有2000行,若不足则取全部(可选逻辑) if total_rows < 2000: print(f"警告:文件{f.split('/')[-1]}行数不足2000,将提取全部行") extracted_rows = target_col else: start_idx = (total_rows - 2000) // 2 end_idx = start_idx + 2000 extracted_rows = target_col.iloc[start_idx:end_idx] # 将提取结果作为新列加入final_df,列名为文件名 file_name = os.path.basename(f) final_df[file_name] = extracted_rows.reset_index(drop=True) # 查看最终结果 print(final_df.head())
关键细节说明
- 列索引修正:如果你的CSV实际第6列确实对应索引
6(比如文件中有隐藏表头或特殊格式),可将df.iloc[:, 5]改为df.iloc[:, 6]。 - 中间行计算逻辑:
(total_rows - 2000) // 2确保从中间位置开始取2000行,避免行号偏移问题。 - reset_index(drop=True):避免不同文件提取的行索引不一致导致合并时出现NaN。
- 列命名:用文件名作为列名,方便后续区分不同CSV的数据源。
内容的提问来源于stack exchange,提问作者user20470612
相关产品推荐
相关产品推荐

