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

Pandas Apply迭代时索引值转为浮点数的原因及解决方法

Pandas apply中索引变为浮点数的原因及解决方法

问题场景

原始DataFrame定义及输出:

data_dict = {'a': {0: 139, 1: 163, 2: 163, 3: 172, 4: 183, 5: 183}, 'b': {0: 400000000.0, 1: 600000000.0, 2: 0.0, 3: 600000000.0, 4: 600000000.0, 5: 0.0}, 'c': {0: 0.234, 1: 0.964, 2: 0.034, 3: 1.173, 4: 0.734, 5: 0.296}}

对应的DataFrame展示:

a            b      c
0  139  400000000.0  0.234
1  163  600000000.0  0.964
2  163          0.0  0.034
3  172  600000000.0  1.173
4  183  600000000.0  0.734
5  183          0.0  0.296

执行以下代码迭代筛选后的行时,发现原索引被转为浮点数:

def adder(row):
    print(row)

df[df['b'].eq(0)].reset_index().apply(adder, axis=1)

输出结果:

index      2.000
a        163.000
b          0.000
c          0.034
Name: 0, dtype: float64
index      5.000
a        183.000
b          0.000
c          0.296

原因分析

核心原因是Pandas的类型统一机制:

  • reset_index()会把原DataFrame的整数索引转为新的index列加入结果中;
  • 当使用apply(axis=1)按行迭代时,Pandas会将整行的所有列转换为同一种数据类型——因为当前行中存在b、c这样的浮点类型列,整行会被向上统一为浮点 dtype,避免类型不兼容导致的数据丢失,原本的整数索引列也就被转为了浮点数。

无需显式转整数的解决方法

方法1:不保留原索引列

如果不需要原索引,直接在reset_index时添加drop=True参数,这样就不会生成index列,自然不存在类型转换问题:

df[df['b'].eq(0)].reset_index(drop=True).apply(adder, axis=1)

此时输出的行中仅包含a、b、c列,a列会保持整数类型,b、c为浮点类型。

方法2:自动推断合适的列类型

利用Pandas的convert_dtypes()方法,自动将可以转换为整数的浮点列(如index列的2.0、5.0)转为整数类型,同时保留其他浮点列的类型:

df[df['b'].eq(0)].reset_index().convert_dtypes().apply(adder, axis=1)

执行后index列会变成整数类型,迭代输出时就不会出现浮点数形式的索引值。

方法3:改用其他迭代方式

如果只是需要遍历行数据,apply并非唯一选择,itertuples()或iterrows()不会强制统一整行类型,能保留各列原有类型:

# 使用itertuples()
for row in df[df['b'].eq(0)].itertuples():
    print(row)

# 使用iterrows()
for idx, row in df[df['b'].eq(0)].iterrows():
    print(row)

两种方式输出的行数据中,原索引和a列都会保持整数类型。


内容的提问来源于stack exchange,提问作者Himanshu Poddar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:36:22