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

