Pandas Обработка больших данных CSV - PullRequest
4 голосов
/ 11 марта 2020

Я обрабатываю большой набор данных размером не менее 8 ГБ, используя pandas.

Я столкнулся с проблемой при чтении всего набора, поэтому я читаю фрагмент файла по фрагменту.

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

Мне нужно удалить дубликаты во всем этом наборе данных на основе столбца ['Уникальные ключи'].

Я пытался использовать pd.concat, но также столкнулся с проблемой с памяти, поэтому я попытался записать файл в CSV-файл и добавить все результаты кадров данных на нем.

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

I ' Я новичок ie в Python, так что было бы действительно полезно, если бы кто-то мог указать мне правильное направление.

def removeduplicates(filename):
    CHUNK_SIZE = 250000
    df_iterator = pd.read_csv(filename, na_filter=False, chunksize=CHUNK_SIZE,
                                      low_memory=False)
    # new_df = pd.DataFrame()
    for df in df_iterator:
        df = df.dropna(subset=['Unique Keys'])
        df = df.drop_duplicates(subset=['Unique Keys'], keep='first')

        df.to_csv(join(file_path, output_name.replace(' Step-2', '') +
                       ' Step-3.csv'), mode='w', index=False, encoding='utf8')

Ответы [ 3 ]

2 голосов
/ 21 марта 2020

Если вы можете уместить в памяти набор уникальных ключей:

def removeduplicates(filename):
    CHUNK_SIZE = 250000
    df_iterator = pd.read_csv(filename, na_filter=False, 
                              chunksize=CHUNK_SIZE,
                              low_memory=False)
    # create a set of (unique) ids
    all_ids = set()

    for df in df_iterator:
        df = df.dropna(subset=['Unique Keys'])
        df = df.drop_duplicates(subset=['Unique Keys'], keep='first')

        # Filter rows with key in all_ids
        df = df.loc[~df['Unique Keys'].isin(all_ids)]

        # Add new keys to the set
        all_ids = all_ids.union(set(df['Unique Keys'].unique()))
1 голос
/ 23 марта 2020

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

В качестве примера с Dask вы можете сделать:

import dask.dataframe as dd

df = dd.read_csv(filename, na_filter=False)

df = df.dropna(subset=["Unique Keys"])
df = df.drop_duplicates(subset=["Unique Keys"])

df.to_csv(filename_out, index=False, encoding="utf8", single_file=True)
1 голос
/ 21 марта 2020

Наверное, проще не делать это с pandas.

with open(input_csv_file) as fin:
    with open(output_csv_file) as fout:
        writer = csv.writer(fout)
        seen_keys = set()
        header = True
        for row in csv.reader(fin):
            if header:
                writer.writerow(row)
                header = False
                continue

            key = tuple(row[i] for i in key_indices)
            if not all(key):  # skip if key is empty
                continue

            if key not in seen_keys:
                writer.writerow(row)
                seen_keys.add(key)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...