熊猫:系列的真值是模棱两可的

时间:2015-06-27 00:46:13

标签: python python-2.7 pandas

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,但这是第一次,所以它很棘手。

1 个答案:

答案 0 :(得分:4)

从您的代码中不清楚您正在尝试做什么。

readdata 所有 csv文件中的数据。你似乎想迭代那些数据(也许你想迭代这些行?),所以你开始这样做,但是你调用readdata上的函数,它们一次给你整行的值。< / p>

让我们与熊猫互动。我创建了一个测试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进行迭代可以得到列名。嗯,这显然不是你想要的。四处寻找告诉我.iterrows()上有一个readdata方法,所以让我们尝试一下:

>>> 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)

一旦你准备好使用更高级的熊猫:

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教程。