Подсчитайте количество строк с одинаковым значением, 24 млн строк

#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. Если вы передаете каждую строку, размер не имеет значения. Он не загрузит полный файл в память.