基于缺失列名切片Pandas DataFrame的问题及解决需求
解决Pandas多重索引DataFrame切片含缺失列的警告与空结果问题
我来帮你搞定这个问题!先理清问题的核心原因:
问题根源
- 用
.loc切片包含不存在的列时,Pandas抛出FutureWarning是因为未来版本会直接触发KeyError,不再默认忽略不存在的列; - 你用
.reindex得到空结果,是因为错误地把列名列表嵌套了一层(columns=[indicators_list])——这相当于让Pandas去找列名是整个列表的列,而不是列表里的单个列,自然找不到匹配项。
两种可行的解决方案
方案一:先筛选存在的列,再用.loc切片
先从目标列列表里过滤出DataFrame中实际存在的列,再进行切片,既不会触发警告,又能精准获取需要的列:
import pandas as pd # 加载数据 d2 = pd.read_csv('https://docs.google.com/uc?id=1Ufx6pvnSC6zQdTAj05ObmV027fA4-Mr3&export=download', index_col=[0,1]) indicators_list = ['ind475', 'ind179'] # 筛选出DataFrame中存在的目标列 existing_cols = [col for col in indicators_list if col in d2.columns] # 执行切片操作 d4 = d2.loc[:, existing_cols] result = d4.dropna(axis=0, how='all').dropna(axis=1, how='all') print(result.shape) # 输出 (2672, 1)
这个方法的优势是只保留实际存在的列,完全规避了警告和错误。
方案二:正确使用.reindex
如果你希望保留目标列列表中的所有列(包括不存在的列,用NaN填充),就要正确调用.reindex,直接传递列名列表即可,不要嵌套:
indicators_list = ['ind475', 'ind179'] # 正确的.reindex用法:直接传入列名列表 d5 = d2.reindex(columns=indicators_list) result = d5.dropna(axis=0, how='all').dropna(axis=1, how='all') print(result.shape) # 输出 (2672, 1)
如果需要给不存在的列填充默认值,可以加上fill_value参数,比如:
d5 = d2.reindex(columns=indicators_list, fill_value=0)
补充:为什么之前的.reindex会得到空结果?
你之前写的d2.reindex(columns=[indicators_list])传递了一个二维列表,Pandas会尝试匹配**列名等于['ind475', 'ind179']**的列,但你的DataFrame列都是单个字符串,所以没有匹配项,最终返回空的DataFrame。去掉外层的列表,直接传columns=indicators_list就能正常工作了。
内容的提问来源于stack exchange,提问作者Mohammad ElNesr
相关产品推荐
相关产品推荐

