Pandas转置DataFrame后使用select_dtypes返回空的原因?
问题原因解析
你的问题核心在于转置后DataFrame的列类型发生了本质变化,具体细节如下:
原DataFrame的列类型:
- 列A、B的元素都是整数,类型为
int64(标准数值型) - 列C因为混入了字符串
'a',整列被判定为object类型(混合类型容器)
- 列A、B的元素都是整数,类型为
转置后的类型变化:
转置后原DataFrame的行变成列,每一列的元素来自原DataFrame的不同列。比如转置后的列I包含:原列A的20(int64)、原列B的222(int64)、原列C的3(属于object列的元素,即使数值本身是整数,存储类型仍为object)。
由于同一列内存在object类型的元素,pandas会将整列类型统一设为object——转置后的所有列都会变成object类型。为什么
select_dtypes('number')返回空:
这个方法的作用是筛选出数值类型的列,而转置后没有任何一列是数值类型,自然返回空结果。
正确实现需求的方法
如果你想删除原DataFrame中包含非数值的行,不需要转置,直接用apply结合pd.to_numeric判断每行是否全为数值即可:
import pandas as pd data = pd.DataFrame({'A':[20,111],'B':[222,200],'C':[3,'a']}, index = ['I','II']) # 筛选所有元素都能转为数值的行 filtered_data = data[data.apply(lambda row: pd.to_numeric(row, errors='coerce').notna().all(), axis=1)] print(filtered_data)
执行结果会保留行I,自动剔除包含非数值'a'的行II。
内容的提问来源于stack exchange,提问作者mrLimpio
相关产品推荐
相关产品推荐

