使用pd.concat()拼接共享单车年度CSV时丢失77万+行数据求助
排查pd.concat拼接后行数丢失的实用步骤
先确认单文件导入的实际行数
别直接相信下载的总行数,先逐个读取文件统计行数,对比累计值和拼接后的值,定位是导入环节还是拼接环节出问题:import pandas as pd import os # 替换成你的12个CSV文件路径列表 file_list = ["month1.csv", "month2.csv", ..., "month12.csv"] total_imported = 0 df_list = [] for file in file_list: df = pd.read_csv(file) row_count = len(df) print(f"{file}: {row_count} 行") total_imported += row_count df_list.append(df) print(f"导入累计总行数: {total_imported}") combined_df = pd.concat(df_list) print(f"拼接后总行数: {len(combined_df)}")检查concat参数是否写错
重点确认有没有误设axis=1——这个参数会把数据按列拼接,最终行数等于所有文件里行数最少的那个,直接导致大量数据丢失。正确的按行拼接写法:# axis=0是默认值,可显式写出确保无误 combined_df = pd.concat(df_list, axis=0, ignore_index=True)验证列名的绝对一致性
哪怕你觉得结构一致,也要检查每个文件的列名是否完全匹配(包括大小写、空格、特殊符号):for idx, df in enumerate(df_list): print(f"第{idx+1}个文件列名: {list(df.columns)}")列名不一致会导致拼接后出现空值列,但一般不会丢行,不过还是要排除这个可能。
排查CSV读取时的隐藏问题
- 用
on_bad_lines='skip'跳过格式错误的行,确认是否是读取时丢了行:df = pd.read_csv(file, on_bad_lines='skip') - 关闭
low_memory选项,避免pandas因自动推断列类型出错导致的读取异常:df = pd.read_csv(file, low_memory=False) - 检查是否有文件下载损坏(比如空文件、行数远少于预期)。
- 用
确认是否是重复行导致的误解
如果后续不小心调用了drop_duplicates(),会减少行数。可以先检查拼接后的数据重复情况:print(f"拼接后重复行数: {combined_df.duplicated().sum()}")
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

