pandas iterrows 将整数变为浮点数

Posted

技术标签:

【中文标题】pandas iterrows 将整数变为浮点数【英文标题】:pandas iterrows changes ints into floats 【发布时间】:2016-04-17 10:30:00 【问题描述】:

我正在尝试遍历包含一些 int64 和一些浮点数的 DataFrame 的行。 iterrows() 似乎正在将我的整数转换为浮点数,这破坏了我想要在下游做的一切:

>>> import pandas as pd
>>> df = pd.DataFrame([[10000000000000001, 1.5], [10000000000000002, 2.5]], columns=['id', 'prc'])
>>> [id for id in df.id]
[10000000000000001, 10000000000000002]
>>> [r['id'] for (idx,r) in df.iterrows()]
[10000000000000000.0, 10000000000000002.0]

直接在df.id 上进行迭代很好。但是通过iterrows(),我得到了不同的值。有没有办法以这样的方式迭代行,我仍然可以按列名索引获得所有正确的值?

【问题讨论】:

【参考方案1】:

Here 是文档的相关部分:

因为iterrows 为每一行返回一个系列,它不会跨行保留数据类型(数据帧跨列保留数据类型)[...]保留 strong> 在遍历行时使用 dtypes,最好使用 itertuples(),它返回值的命名元组,通常比 iterrows 更快。

您的数据示例:

>>> df = pd.DataFrame([[10000000000000001, 1.5], [10000000000000002, 2.5]], columns=['id', 'prc'])
>>> [t[1] for t in df.itertuples()]
[10000000000000001, 10000000000000002]

【讨论】:

【参考方案2】:

如果可能,您最好避免迭代。检查您是否可以先矢量化您的工作。

如果无法进行矢量化,您可能需要DataFrame.itertuples。这将返回一个可迭代的(命名)元组,其中第一个元素是索引标签。

In [2]: list(df.itertuples())
Out[2]:
[Pandas(Index=0, id=10000000000000001, prc=1.5),
 Pandas(Index=1, id=10000000000000002, prc=2.5)]

iterrows 为每一行返回一个系列。由于系列由 numpy 数组支持,其元素必须全部共享一个类型,因此您的 int 被强制转换为浮点数。

【讨论】:

以上是关于pandas iterrows 将整数变为浮点数的主要内容,如果未能解决你的问题,请参考以下文章

将 pandas 数据框列标签从浮点数转换为整数

将具有 1.185 亿欧元或 6 万欧元等货币值的 pandas 列转换为整数或浮点数 [关闭]

Pandas to_dict 意外修改浮点数

pandas创建内容全是0的dataframepandas基于随机整数随机浮点数创建dataframe(random numbers)

将浮点数的数据框转换为熊猫中的整数?

Python pandas 带有 to_csv 的大浮点数