Непонятно, из вашего кода, что вы пытаетесь сделать.
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.
Обратите внимание, что выполнение этого способа, вероятно, намного медленнее, чем необходимо, и настоящий эксперт 'pandas' покажет вам, как использовать операции массивного массива, чтобы найти все строки с одним столбцом, равным другому' + i', в один оператор без итерации по строкам. Тем не менее, это потому, что после того, как вы намокли ноги. –
Ваш код sir пропускает первую строку и начинает печатать со второго, но это хорошо, я добавил 'header = None' – Lynob
, что самый быстрый способ? Я работаю с 5 миллионами строк, поэтому мне нужна вся скорость, которую я могу получить, и так же, как я решил проблему, неправильно, должен работать со столбцами, я не знаю, что я думал, я заслуживаю downvotes .. – Lynob