【问题标题】:pandas iterrows changes ints into floatspandas iterrows 将整数变为浮点数
【发布时间】: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(),我得到了不同的值。有没有办法以这样的方式迭代行,我仍然可以按列名索引获得所有正确的值?

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案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 被强制转换为浮点数。

      【讨论】:

        猜你喜欢
        • 2016-10-14
        • 2014-02-13
        • 2010-11-24
        • 1970-01-01
        • 2017-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多