使用列表筛选Pandas DataFrame后结果尺寸异常问题咨询
问题原因及解决方案
你遇到的列数不符合预期的情况,核心原因是DataFrame df 包含重复列名,或是筛选列表 L 内存在重复的列名,结合你的数据维度,前者是最可能的诱因,具体分析如下:
1. df存在重复列名
当df里有多个列共享同一个名称时,用列名列表L筛选时,Pandas会把所有匹配该名称的列全部选中,而非只选取一次。
举个极简示例:
import pandas as pd # 构造含重复列名的DataFrame df = pd.DataFrame([[1,2,3], [4,5,6]], columns=['a','a','b']) L = ['a','b'] print(len(L)) # 输出:2 print(df[L].shape) # 输出:(2, 3) —— 因为df里有两个名为'a'的列
对应你的场景:df中部分列名重复出现,L里的单个列名会匹配df中所有同名列,最终导致结果列数超过L的长度。
2. L中存在重复列名
如果L内有重复的列名(比如同一个列名被多次写入),df[L]会按顺序重复选中该列,最终结果列数等于L的长度(你的情况是结果列数更多,所以这种情况不是主因,但也可以排查)。
验证步骤
你可以用以下代码快速定位问题:
- 检查
df是否有重复列名:# 判断是否存在重复列名 print(df.columns.duplicated().any()) # 查看所有列名的出现频次 print(df.columns.value_counts()) - 检查
L是否有重复元素:from collections import Counter # 输出L中重复的列名及其次数 print({k:v for k, v in Counter(L).items() if v > 1})
解决办法
针对df重复列名的情况
先给df的重复列名添加唯一后缀,再执行筛选:
# 自动给重复列名添加后缀(如_a、_b) df.columns = pd.io.parsers.base_parser.ParserBase({'usecols': None})._maybe_dedup_names(df.columns) # 再筛选 filtered_df = df[L] print(filtered_df.shape) # 此时列数应与L的长度一致
针对L重复列名的情况
对L去重后再筛选(保留原顺序):
# 保持顺序的去重方法 L_unique = list(dict.fromkeys(L)) filtered_df = df[L_unique]
内容的提问来源于stack exchange,提问作者Snehal Patel
相关产品推荐
相关产品推荐

