2015-06-27 3 views
-3
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(). 

Я настаиваю на использование панд, если это возможно, поскольку он предлагает много вещей, которые я хочу работать. если это невозможно, я знаю, как это сделать в модуле csv, я изменил код, чтобы использовать панды, но это первый раз, так что это сложно.

ответ

4

Непонятно, из вашего кода, что вы пытаетесь сделать.

readdataвсе данные в файле csv. Кажется, вы хотите перебирать эти данные (возможно, вы хотите перебирать строки?), Поэтому вы начинаете это делать, но затем вы вызываете функции на readdata, которые дают сразу целые строки значений.

Давайте играть интерактивно с пандами. Я создал тест CSV файл:

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

Теперь, в питона:

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 

Теперь пришло время, чтобы погрузиться в документы, чтобы выяснить больше о том, как форматировать объекты панды серии, чтобы получить выход так, как вы хотите. В качестве подсказки, с помощью этого (после сдачи 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.

+0

Обратите внимание, что выполнение этого способа, вероятно, намного медленнее, чем необходимо, и настоящий эксперт 'pandas' покажет вам, как использовать операции массивного массива, чтобы найти все строки с одним столбцом, равным другому' + i', в один оператор без итерации по строкам. Тем не менее, это потому, что после того, как вы намокли ноги. –

+0

Ваш код sir пропускает первую строку и начинает печатать со второго, но это хорошо, я добавил 'header = None' – Lynob

+0

, что самый быстрый способ? Я работаю с 5 миллионами строк, поэтому мне нужна вся скорость, которую я могу получить, и так же, как я решил проблему, неправильно, должен работать со столбцами, я не знаю, что я думал, я заслуживаю downvotes .. – Lynob

Смежные вопросы