0

我有一组 CSV 文件,每个文件都有一年的数据,每个文件都有YEAR列。我想将它们转换为按年份划分的单个镶木地板数据集,以供以后在熊猫中使用。问题是所有年份组合的数据框太大而无法放入内存。是否可以逐个迭代地编写镶木地板分区?

fastparquet用作引擎。

简化的代码示例。此代码会破坏内存使用并崩溃。

df = []
for year in range(2000, 2020):
  df.append(pd.read_csv(f'{year}.csv'))
df = pd.concat(df)
df.to_parquet('all_years.pq', partition_cols=['YEAR'])

我试着把岁月一一写出来,就像这样。

for year in range(2000, 2020):
  df = pd.read_csv(f'{year}.csv')
  df.to_parquet('all_years.pq', partition_cols=['YEAR'])

数据文件都在各自的YEAR=XXXX目录中,但是当我尝试读取这样的数据集时,我只得到了最后一年。也许可以在编写单独的分区后修复镶木地板元数据?

4

1 回答 1

1

我想我找到了一种使用fastparquet.writer.merge()函数的方法。Parquet 文件每年一个一个地编写,省略 YEAR 列并给它们适当的名称,然后该merge()函数创建顶级 _metadata 文件。

下面的代码是一个要点,因为我从我的具体用例中遗漏了许多细节。

years = range(2000, 2020)
for year in years:
  df = pd.read_csv(f'{year}.csv').drop(columns=['YEAR'])
  df.to_parquet(f'all_years.pq/YEAR={year}')
fastparquet.writer.merge([f'all_years.pq/YEAR={y}' for y in years])

df_all = pd.read_parquet('all_years.pq')
于 2020-08-21T22:40:31.147 回答