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

如何在Pandas迭代DataFrame时保留原有数据类型?

解决DataFrame迭代时int类型变为float的问题

这个问题我之前踩过坑!通常这种直接打印DataFrame时类型正常,但迭代就变float的情况,大概率是你的DataFrame里隐性存在NaN值,或者迭代方式触发了自动类型转换。下面给你几个实用的解决思路:

1. 先排查是否存在NaN值

pandas的普通int类型列无法容纳NaN值,一旦列中出现NaN,pandas会自动把整列的类型提升为float(因为NaN属于浮点类型)。你可以先检查哪一列有空值:

print(df.isna().any())  # 输出每列是否存在NaN

如果确实存在NaN,有两种处理方式:

  • 填充NaN后转回int:
    df = df.fillna(0).astype(int)  # 用0填充NaN,再转成int类型
    
  • 使用支持nullable的Int64类型(注意大写I),它既能保留int类型,又能兼容NaN:
    df['df_between'] = df['df_between'].astype('Int64')
    df['df_within'] = df['df_within'].astype('Int64')
    df['df_total'] = df['df_total'].astype('Int64')
    

2. 更换更靠谱的迭代方式

不同的迭代方法对数据类型的保留效果不同:

  • 如果用的是iterrows(),返回的每一行是Series,容易触发类型转换,你可以在迭代时手动转类型:
    for idx, row in df.iterrows():
        df_between = int(row['df_between'])
        df_within = int(row['df_within'])
        df_total = int(row['df_total'])
        # 后续业务逻辑
    
  • 更推荐用itertuples(),它返回的是namedtuple,不仅效率更高,还能更贴近原数据的类型:
    for row in df.itertuples(index=False):
        df_between = row.df_between
        df_within = row.df_within
        df_total = row.df_total
        # 若原列是Int64类型,这里的值会是int或None,不会自动转float
    

3. 创建DataFrame时指定正确类型

有时候数据读取或生成时,pandas的自动类型推断会出错,你可以在创建时直接指定dtype:

# 全局指定nullable int类型
df = pd.DataFrame(your_data, dtype='Int64')

# 或者针对特定列指定
df = pd.DataFrame(your_data, dtype={
    'df_between': 'Int64',
    'df_within': 'Int64',
    'df_total': 'Int64'
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:27:24