Pandas先取行再取列与先取列再取行返回值数据类型差异咨询
该行为属于Pandas固有设计特性,并非Bug
两种取值路径的底层差异
- 先取列再取行:
df['X']会提取出独立的X列Series,该Series本身的类型就是int32,后续取该列第一行元素时,是直接从纯int类型的数组中取值,不会发生类型转换,自然保留原int类型。 - 先取行再取列:
df.iloc[0]会提取出第一行对应的Series,该行包含int类型的X值和float类型的Y值。Pandas的Series底层默认基于NumPy的同构数组实现,同一个数组无法同时存储int和float两种数值类型,因此Pandas会自动执行向上兼容的类型转换,将该行所有值都转换为精度更高的float64类型,此时再从该行中取X列的值,得到的就是转换后的float类型。
规避方法
如果需要保留原数据类型,建议直接定位单个单元格,避免先生成整行的Series:
# 直接定位第0行X列的单元格 x_val = df.iloc[0, df.columns.get_indexer_for(["X"])[0]] print(type(x_val)) # 输出为numpy.int32
复现说明
你提供的复现代码及输出是正确的,该行为在当前所有稳定版Pandas中都可复现:
复现代码
import numpy as np import pandas as pd print(np.__version__, pd.__version__, '\n') # 创建两列数据,一列为int类型,一列为float类型 data1 = np.arange(1, 5, dtype=int) data2 = np.arange(2, 6, dtype=float) df = pd.DataFrame(data={'X': data1, 'Y': data2}) # 查看DataFrame各列数据类型 print(df.dtypes, '\n') # 先取列再取行,返回int类型 print('先取列再取行: ', type(df['X'].iloc[0])) # 先取行再取列,返回float类型 print('先取行再取列: ', type(df.iloc[0]['X']))
输出结果
1.21.2 1.3.4 X int32 Y float64 dtype: object 先取列再取行: <class 'numpy.int32'> 先取行再取列: <class 'numpy.float64'>
内容的提问来源于stack exchange,提问作者Tom Johnson
相关产品推荐
相关产品推荐

