Я ищу более эффективный способ, чем pd.concat, для объединения двух фреймов данных pandas.
У меня есть большой DataFrame (размером ~ 7 ГБ) со следующими столбцами - «A», «B», «C», «D». Я хочу сгруппировать по кадру по «А», затем для каждой группы: сгруппировать по «В», усреднить «С» и суммировать «D», а затем объединить все результаты в один фрейм данных. Я пробовал следующие подходы -
1) Создание пустого конечного DataFrame, итерация группы по «A», выполняющая необходимую мне обработку, а затем pd.concat для каждой группы конечный DataFrame. Проблема в том, что pd.concat работает очень медленно.
2) Итерации по группе «А», выполняя необходимую мне обработку и сохраняя результат в файл csv. Это работает нормально, но я хочу узнать, есть ли более эффективный способ, который не включает в себя все операции ввода-вывода для записи на диск.
Примеры кода
Первый подход - Final DataFrame с pd.concat:
def pivot_frame(in_df_path):
in_df = pd.read_csv(in_df_path, delimiter=DELIMITER)
res_cols = in_df.columns.tolist()
res = pd.DataFrame(columns=res_cols)
g = in_df.groupby(by=["A"])
for title, group in g:
temp = group.groupby(by=["B"]).agg({"C": np.mean, "D": np.sum})
temp = temp.reset_index()
temp.insert(0, "A", title)
res = pd.concat([res, temp], ignore_index=True)
temp.to_csv(f, mode='a', header=False, sep=DELIMITER)
return res
Второй подход - Запись на диск:
def pivot_frame(in_df_path, ouput_path):
in_df = pd.read_csv(in_df_path, delimiter=DELIMITER)
with open(ouput_path, 'w') as f:
csv_writer = csv.writer(f, delimiter=DELIMITER)
csv_writer.writerow(["A", "B", "C", "D"])
g = in_df.groupby(by=["A"])
for title, group in g:
temp = group.groupby(by=["B"]).agg({"C": np.mean, "D": np.sum})
temp = temp.reset_index()
temp.insert(0, JOB_TITLE_COL, title)
temp.to_csv(f, mode='a', header=False, sep=DELIMITER)
Второй подход работает намного быстрее, чем первый, но я ищу что-то, что избавило бы меня от постоянного доступа к диску. Я читал о разделении-применении-объединении (например, https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html), но мне это не помогло.
Большое спасибо! :)