Чтение фреймов данных, сохраненных как parquet с помощью pyarrow, сохранение имен файлов в столбцах

#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())) . Но я рекомендую вам обновить