Pandas iterrows函数将整数更改为浮点数。

14

我正在尝试迭代包含一些int64和一些float的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(),我得到了不同的值。有没有一种方法可以迭代行,以便我仍然可以通过列名进行索引并获取所有正确的值?
2个回答

11
以下是相关文档的内容:

这里是相关文档的内容:

因为 iterrows 为每一行返回一个序列,它不会保留跨行的数据类型(对于数据框架,数据类型在列之间保留)[...] 要在迭代行时保留数据类型,最好使用 itertuples(),它返回值的命名元组,通常比 iterrows 更快。

以下是您的数据示例:

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

3

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

如果无法矢量化,则可能需要使用DataFrame.itertuples。它将返回一个(named)tuples的可迭代对象,其中第一个元素是索引标签。

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

iterrows方法对每一行返回一个Series对象。由于Series对象是由NumPy数组支持的,其中所有元素必须共享相同的类型,因此您的整数被转换为浮点数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接