#python #pandas #pyarrow
#python #pandas #pyarrow
Вопрос:
Я хочу прочитать папку, полную файлов parquet, которые содержат фреймы данных pandas. В дополнение к данным, которые я читаю, я хочу сохранить имена файлов, из которых считываются данные, в столбце «file_origin». В pandas я могу сделать это следующим образом:
import pandas as pd
from pathlib import Path
data_dir = Path("path_of_folder_with_files")
df = pd.concat(
pd.read_parquet(parquet_file).assign(file_origin=parquet_file.name)
for parquet_file in data_dir.glob("*")
)
К сожалению, это довольно медленно. Есть ли аналогичный способ сделать это с помощью pyarrow (или любого другого эффективного пакета)?
import pyarrow.parquet as pq
table = pq.read_table(data_dir, use_threads=True)
df = table.to_pandas()
Ответ №1:
Вы могли бы реализовать это с помощью arrow вместо pandas:
batches = []
for file_name in data_dir.glob("*"):
table = pq.read_table(file_name)
table = table.append_column("file_name", pa.array([file_name]*len(table), pa.string()))
batches.extend(table.to_batches())
return pa.Table.from_batches(batches)
Я не ожидаю, что это будет значительно быстрее, если только у вас в таблице не много строк и объектов (которые в pandas работают медленно).
Комментарии:
1. Спасибо. Однако это дает мне следующее:
TypeError: append_column() takes exactly one argument (2 given)
. Есть идеи?2. какую версию pyarrow вы используете?
pa.__version__
3. 0.11.1 — моя версия
4. API отличается. Попробуйте
table.append_column(pa.column("file_name", pa.array([file_name]*len(table), pa.string()))
. Но я рекомендую вам обновить