#python #python-3.x #pandas #csv
#python #python-3.x #панды #csv
Вопрос:
Итак, у меня есть этот огромный CSV, я создал тестовый скрипт, чтобы увидеть количество строк, и он возвращает около 24 миллионов строк. Я хочу извлечь количество строк с одинаковым номером CIK и перенести эти данные в отдельный CSV.
Таким образом, требуемый вывод в другом файле будет:
Номер CIK: количество IP-адресов с этим номером CIK.
У меня были некоторые идеи, но они были недостаточно эффективными, поэтому скрипт был бесполезен, потому что для просмотра csv потребовалась целая вечность. Итак, кто-нибудь сталкивался с подобной проблемой, как у меня?
Должен ли я использовать Pandas для этого, любое предложение было бы огромной помощью!
Пример CSV:
Ответ №1:
Как насчет использования счетчика?
import collections, csv
with open("big.csv") as csvfile:
counter = collections.Counter(row["cik"] for row in csv.DictReader(csvfile))
with open("out.csv", "w") as outfile:
writer = csv.writer(outfile)
writer.writerow(("cik", "count"))
for cik, count in counter.items():
writer.writerow((cik, count))
Накладные расходы на память для этого будут зависеть от количества CIK, а не от количества строк. Я не знаю, сколько это, поэтому я не знаю, будет ли это проблемой.
Комментарии:
1. Это хороший ответ. Вы также можете легко записать результаты в файл csv построчно, что тоже должно быть быстрым.
2. @brunns Ну, я уже пробовал с коллекцией / счетчиком, но у меня возникли некоторые проблемы с кодом, возможно, из-за моей плохой реализации. Это работает, но для завершения date и cik требуется около 9 минут. Я не знаю, будут ли панды делать это быстрее?
3. Извините, я не пользователь pandas. Возможно, это возможно, но я не могу вам в этом помочь. Я только что дал вам лучшее решение, которое я мог придумать на чистом python.
4. @HS-nebula, поскольку между нами вы больше всего знакомы с Pandas, можете ли вы ответить на мой предыдущий вопрос?
5. @Stefan Я имею в виду, способ сделать это в Pandas показан в моем ответе. Вероятно, вы могли бы прочитать файл с помощью
csv
модуля в список списков, а затем преобразовать его в фрейм данных. Это может ускорить загрузку файла. Однако я не уверен, чтоgroupby
ответ будет быстрее, чем этот.
Ответ №2:
Вы можете использовать pandas
для groupby
CIK
столбца, а затем использовать size()
для получения общего количества CIK
значений.
Например,
import pandas as pd
df = pd.read_csv('name.csv')
ndf = df.groupby('CIK').size()
ndf.to_csv("CIK_number.csv")
Я думаю, что, возможно, я неправильно понял ваш желаемый результат. Если вы хотите, чтобы CIK, IP-пары по количеству раз, когда появляется CIK, выполните
df = pd.DataFrame({'CIK': ['102', '102', '103', '103', '104'], 'IP':['103.92.134', '103.92.134', '103.92.135', '103.92.136', '105.32.134'], 'C1': [1, 2, 3, 4,5 ], 'C2':[1,0,0,1,0]})
ndf = df.groupby(['CIK','IP'])['CIK'].size().reset_index()
ndf.rename(columns={0: 'count'}, inplace=True)
### returns
CIK IP count
0 102 103.92.134 2
1 103 103.92.135 1
2 103 103.92.136 1
3 104 105.32.134 1
Для чтения в большом файле CSV в pandas
do
chunks = []
for chunk in pd.read_csv('csv_name.csv', chunksize = 100):
chunks.append(chunk)
df = pd.concat(chunks)
Комментарии:
1. Я не очень хорошо знаком с pandas, но попробую ваше решение
2. @Stefan Возможно, я неправильно понял ваш желаемый результат. Проверьте, соответствует ли мое редактирование тому, что вы хотите.
3. Для чтения в большом CSV
pandas
-файле вы можете использоватьchunksize
параметр, а затем объединить меньшие фреймы данных.4. Я опробовал ваше прошлое решение @HS-nebula, но мой скрипт разбился, может быть, он не может обрабатывать такой большой файл?
5. И вопрос о выходе: номер CIK: количество IP-адресов с этим номером CIK
Ответ №3:
Вы можете использовать pandas, но это не очень эффективно:
import pandas
df = pandas.read_csv('my.csv')
Но быстрый и грязный способ — просто передать файл в потоковом режиме и извлечь его с помощью простого сопоставления строк, а затем записать ваш новый файл:
with open("my.csv") as infile:
for line in infile:
if "CIK_number" in line :
do_something_with(line)
Комментарии:
1. программа чтения csv на python тоже хороша, но если вы просто переделываете точный файл, возможно, он вам не нужен? Полагаю, я предполагаю, что вам не нужен большой объект в памяти, поэтому вам нужен простой поток.
2. Вы не поняли мой вопрос, я не хочу вводить конкретный cik. Я хочу, чтобы скрипт извлекал, сколько IP-адресов имеют одинаковый CIK для каждого IP-адреса в csv, но с размером csv это проблема…
3. Если вы передаете каждую строку, размер не имеет значения. Он не загрузит полный файл в память.