Подсчет значения в нескольких DataFrames - PullRequest
0 голосов
/ 11 мая 2018

У меня есть несколько CSV-файлов, которые содержат данные одного типа.Я хочу подсчитать вхождения определенного значения в столбце по всем файлам csv (они слишком велики, чтобы обрабатывать их как один файл).Было бы неплохо иметь результат в одной серии, как если бы вы считали вхождения одного файла.Как бы я смог достичь этого с пандами?

Примером может быть:

file 1

gender
-------
man
woman
woman
woman


file 2

gender
-------
man
man
woman
woman


Result

 man 3
 woman 5

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Скажите, что у вас есть список file_list с путями к файлам, которые вы хотите прочитать. Затем вы можете перебрать все файлы и сохранить вхождения записей в интересующем вас столбце (скажем, gender)

import pandas as pd

series_list = []
for file in file_list:
    df = pd.read_csv(file)
    count_series = df['gender'].value_counts()
    series_list.append(count_series)

total_counts = pd.Series()
for ser in series_list:
    total_counts = total_counts.add(ser, fill_value=0)

print(total_counts)
0 голосов
/ 11 мая 2018

Вы можете использовать dask.dataframe, чтобы выполнить группирование и агрегацию в режиме без вывода сообщений.

import dask.dataframe as dd

df = dd.read_csv('*.csv')  # use all csv files in directory

res = df['gender'].value_counts().compute()

Возвращает серию а-ля pd.Series.value_counts.

dask решение, использующее алгоритмы pandas для блоков, будет работать, даже если один файл не может быть загружен в память.

0 голосов
/ 11 мая 2018

Предполагая, что вы можете прочитать каждый файл отдельно в памяти, вы можете использовать collections.Counter для создания списка счетчиков.

Затем объедините их на последнем этапе с помощью sum.

from io import StringIO
import pandas as pd
from collections import Counter

file1 = StringIO("""gender
man
woman
woman
woman""")

file2 = StringIO("""gender
man
man
woman
woman""")

# replace file1, file2 with 'file1.csv', 'file2.csv'
lst = [Counter(pd.read_csv(f)['gender']) for f in [file1, file2]]

# aggregate list of Counter objects
res = sum(lst, Counter())

print(res)

Counter({'man': 3, 'woman': 5})

Если вы не можете загрузить хотя бы один файл в память, вы можете использовать csv.reader с collections.defaultdict, чтобы выполнять итерацию построчно и получать эквивалентный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...