Усреднение больших CSV-файлов - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть два больших файла CSV, которые загружаются как итераторы, используя pd.read_csv.Файлы настолько большие, что не помещаются в памяти:

df1 = pd.read_csv('file1.csv', chunksize=5000000, iterator=True)
df2 = pd.read_csv('file2.csv', chunksize=5000000, iterator=True)

Содержимое файлов выглядит примерно так:

df1

Id   val1   val2   val3
1    0.5    0.45   0.13
2    0.11   0.18   0.20

df2

Id   val1   val2   val3
1    0.4    0.5    0.20
2    0.13   0.30   0.22

Столбец Id имеет одинаковые значения для обоих файлов.То же самое верно для имен столбцов.То, что я хочу сделать, это взять элементарное среднее значение в столбцах val и поместить их в другой CSV с таким же столбцом Id.

Итак, результат для этого будет выглядеть примерно так:

Id   val1   val2   val3
1    0.45   0.475  0.165
2    0.12   0.24   0.21

Есть какие-нибудь мысли о том, как это сделать?read_csv будет правильным подходом или я должен использовать что-то вроде dask?Я думал об одновременной итерации итераторов и использовании средств чанков, а затем добавлял их в другой файл csv, но я не уверен, возможно ли это на самом деле с такими вещами, как для циклов

1 Ответ

0 голосов
/ 11 декабря 2018

Я не пробовал код ниже, но я думаю, вы можете видеть, куда я шел с ним.Вы можете использовать функцию skiprows и nrows.Я чувствую, что dask - это, вероятно, «правильный» способ сделать это.Я использовал его немного в прошлом, их API казался довольно простым в использовании.

import pandas as pd

result = []

MAX_ROW_NO= 1000
STEP_SIZE = 10

for i in range(0,M AX_ROW_NO, STEP_SIZE):
    temp1 = pd.read_csv("file1.csv",skiprows=i,nrows=STEP_SIZE)
    temp2 = pd.read_csv("file2.csv",skiprows=i,nrows=STEP_SIZE)
    temp_avg = (temp1 + temp2)/2
    result.append(temp_avg)

df_avg = pd.concat(result)

РЕДАКТИРОВАТЬ: Я думаю, что решение Dask будет выглядеть немного лучше.Я думаю, это будет выглядеть примерно так:

import dask.dataframe as dd
df1 = dd.read_csv('file1.csv')
df2 = dd.read_csv('file.csv')

df_avg = (df1 + df2)/2

df_avg.to_csv("file_avg.csv")

Я не пробовал это, но команды dask dataframe похожи на команды pandas и просты в использовании.

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