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