pandas iterrows将整个内容更改为浮点数

时间:2016-01-12 17:18:06

标签: python python-2.7 pandas

我正在尝试迭代包含一些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(),我获得了不同的价值观。有没有办法迭代行,我仍然可以按列名索引获取所有正确的值?

2 个答案:

答案 0 :(得分:3)

Here是文档的相关部分:

  

因为iterrows为每一行返回一个Series,它不会在行中保留dtypes (dtypes在DataFrames的列之间保留)[...]要保留在遍历行的dtypes时,最好使用itertuples(),它返回值的namedtuples,并且通常比它更快。

您的数据示例:

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

答案 1 :(得分: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被转换为浮点数。