Pandas append操作莫名新增列,请求技术排查协助
排查从大型CSV提取列生成多DataFrame的问题
看起来你在处理大型CSV拆分多DataFrame时遇到了定位困难的问题,我来帮你梳理几个最容易踩坑的点,以及对应的排查方案:
1. 先解决字符串判断的核心坑:is vs ==
你代码里用了if name is table1,这在Python里很容易出问题!is判断的是两个对象的内存地址是否完全相同,而字符串内容比较应该用==。除非table1是你提前定义的单例字符串变量,否则大概率这里的判断会直接失败,导致后续逻辑根本没执行。
修正建议:
# 把 is 换成 == 来判断内容一致 if name == table1 and all([m in df_allcol.columns for m in listoflists[i]]):
2. 列列表的索引是否和循环变量对应?
你提到代码在遍历name和i的for循环内,但示例里写的是listoflists[0...——这里是不是应该用循环变量i来索引?比如如果你的循环是for i, name in enumerate(list_of_table_names):,那对应的列列表应该是listoflists[i],而不是固定的0,否则每次循环都只会取第一组列,完全不符合拆分多DataFrame的需求。
3. 大型CSV的列名可能藏着格式问题
大型CSV经常会出现列名带前后空格、大小写不一致的情况,比如CSV里的列是" UserName ",但你检查的是"UserName",这时候m in df_allcol.columns会返回False。
快速排查/修正方案:
# 先统一处理列名:去除前后空格 df_allcol.columns = df_allcol.columns.str.strip() # 如果需要忽略大小写匹配,可以再加一步 df_allcol.columns = df_allcol.columns.str.lower() # 对应的,你的listoflists里的列名也要同步转小写 listoflists = [[col.lower() for col in cols] for cols in listoflists]
4. 调试技巧帮你快速定位问题
如果还是找不到问题,在循环里加几个调试打印,直观看到每一步的状态:
for i, name in enumerate(list_of_table_names): print(f"当前循环:i={i}, 表名={name}") print(f"待提取的列列表:{listoflists[i]}") print(f"CSV所有列:{list(df_allcol.columns)}") # 单独打印判断条件的结果 name_match = (name == table1) cols_exist = all([m in df_allcol.columns for m in listoflists[i]]) print(f"表名匹配:{name_match},所需列都存在:{cols_exist}") # 再执行你的逻辑 if name_match and cols_exist: # 生成对应DataFrame的代码 target_df = df_allcol[listoflists[i]].copy() # ...后续处理
这样你就能清楚看到哪一步不符合预期,是名称没匹配上,还是列确实缺失。
内容的提问来源于stack exchange,提问作者DrakeMurdoch
相关产品推荐
相关产品推荐

