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 将整数变为浮点数的主要内容,如果未能解决你的问题,请参考以下文章
将具有 1.185 亿欧元或 6 万欧元等货币值的 pandas 列转换为整数或浮点数 [关闭]
pandas创建内容全是0的dataframepandas基于随机整数随机浮点数创建dataframe(random numbers)