【问题标题】:Pandas: The truth value of a Series is ambiguous熊猫:一个系列的真值是模棱两可的
【发布时间】:2015-09-14 01:08:25
【问题描述】:
import pandas

readdata = pandas.read_csv("/home/Projects/test1.csv")

for i in range (1,4):
    for line in readdata:
        if readdata.irow(0) + i == readdata.irow(1):
            print readdata

我正在使用 python 2.7

Traceback (most recent call last):
  File "/home/PycharmProjects/filters.py", line 8, in <module>
    if readdata.irow(0) + i == readdata.irow(1):
  File "/home/.virtualenvs/env/lib/python2.7/site-packages/pandas/core/generic.py", line 714, in __nonzero__
    .format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

如果可能,我坚持使用 pandas,因为它提供了许多我想使用的东西。如果不可能,那么我知道如何在 csv 模块中执行此操作,我更改了代码以使用 pandas,但这是第一次,所以很棘手。

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    从您的代码中不清楚您要做什么。

    readdata所有 csv 文件中的数据。您似乎想要遍历该数据(也许您想要遍历行?),所以您开始这样做,但随后您调用 readdata 上的函数,一次为您提供整行值。

    让我们与熊猫互动游戏吧。我创建了一个测试 csv 文件:

    "x","y"
    1,3
    2,6
    3,9
    4,10
    

    现在,在 python 中:

    Python 2.7.10 (v2.7.10:15c95b7d81dc, May 23 2015, 09:33:12) 
    [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import pandas
    >>> readdata = pandas.read_csv("/tmp/test1.csv")
    

    你有那个。现在让我们看看readdata是什么:

    >>> readdata
       x   y
    0  1   3
    1  2   6
    2  3   9
    3  4  10
    

    好的,这样就可以读取数据了。但是当您尝试对其进行迭代时会发生什么?

    >>> for line in readdata:
    ...     print repr(line)
    ... 
    'x'
    'y'
    

    哦不!仅迭代 readdata 就可以得到列名。那么这显然不是你想要的。闲逛告诉我readdata 上有一个.iterrows() 方法,所以让我们试试吧:

    >>> for (linenum, line) in readdata.iterrows():
    ...   print line.irow(0)
    ... 
    1
    2
    3
    4
    

    那更好。那么这会如你所愿吗?

    import pandas
    
    readdata = pandas.read_csv("/home/Projects/test1.csv")
    
    for i in range (1,4):
        for (linenum, line) in readdata.iterrows():
            if line.irow(0) + i == line.irow(1):
                print line
    

    现在是深入研究文档的时候了,以了解有关如何格式化 pandas 系列对象以按照您想要的方式获得输出的更多信息。作为提示,使用它(在将 import sys 放在脚本顶部之后)而不是 print line 可能是您想要的:

                pandas.DataFrame([line]).to_csv(sys.stdout, index=False, header=False)
    

    一旦您准备好使用更高级的 pandas:

    import pandas
    import sys
    
    readdata = pandas.read_csv("/home/Projects/test1.csv", header=None)
    
    for i in range (1,4):
      readdata[readdata.icol(0) + i == readdata.icol(1)].to_csv(sys.stdout, index=False, header=False)
    

    或者,如果您想要单独的文件:

    import pandas
    
    readdata = pandas.read_csv("/home/Projects/test1.csv", header=None)
    
    for i in range (1,4):
      with open("/home/Projects/test1.out.%d.csv" % i, "w") as f:
        readdata[readdata.icol(0) + i == readdata.icol(1)].to_csv(f, index=False, header=False)
    

    使用数组操作一次抓取整个大片数据。

    使用 pandas 更快地制作东西的基本关键是用数组操作替换在 python 中迭代完成的循环。但是,如果您对这种用法感到惊讶,您真的需要停下来学习一个或多个 pandas 教程。

    【讨论】:

    • 请注意,这样做可能比必要的要慢得多,真正的pandas 专家会向您展示如何使用批量数组操作来查找一列等于另一列的所有行@ 987654339@ 在单个语句中,无需对行进行迭代。不过,那是在你湿了脚之后。
    • 您的代码先生跳过第一行并从第二行开始打印,但没关系,我添加了header=None
    • 最快的方法是什么?我正在处理 500 万行,所以我需要我能得到的所有速度,顺便说一句,我解决问题的方式是错误的,应该一直在处理列,我不知道我在想什么,我应该被否决.. .
    • 500 万并不是我所说的足够大以至于太在意速度,但我更新了答案,向您展示如何使用数组操作来选择您想要的数据。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    相关资源
    最近更新 更多