You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:54:03