如何在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
相关产品推荐
相关产品推荐

