提取DataFrame行时如何保留元素的int/float原始类型?
解决提取行时int类型变为float的问题
这个问题我之前也碰到过,本质是pandas中Series与DataFrame的类型机制差异导致的:当你用df.iloc[df['i'].argmin()]取出一行时,得到的是一个Series对象——而Series要求所有元素必须是同一数据类型,因为你的j列是float类型,所以i列的int会被自动向上转换为float,最终整行的dtype都变成了float,也就出现了0变成0.0的情况。
解决方案:保持结果为DataFrame格式
只需要把索引改成列表形式,让iloc返回一个单行的DataFrame,这样每列的原始数据类型就会被保留:
# 用列表包裹索引,返回DataFrame而非Series min_row = df.iloc[[df['i'].argmin()]]
测试一下结果:
print(min_row) # i j # 0 0 0.3 print(min_row.dtypes) # i int64 # j float64
可以看到i列依然保持了原始的int64类型。
替代方案:如果需要Series格式
如果你确实需要得到Series对象,可以手动将i元素转换回int类型:
min_row_series = df.iloc[df['i'].argmin()] min_row_series['i'] = int(min_row_series['i'])
不过这种方法只适合单个元素的场景,更推荐第一种保持DataFrame的方案,能从根源上避免类型转换问题。
额外提示:用idxmin替代argmin
你也可以用df['i'].idxmin()直接获取最小值对应的行标签,再用loc取出,同样要注意用列表包裹索引来保留类型:
min_row = df.loc[[df['i'].idxmin()]]
内容的提问来源于stack exchange,提问作者N08
相关产品推荐
相关产品推荐

