如何将多级索引的pandas数据框保存为parquet格式?

17

我该如何将最后显示的数据框保存为parquet格式?
它是这样构建的:

df_test = pd.DataFrame(np.random.rand(6,4))
df_test.columns = pd.MultiIndex.from_arrays([('A', 'A', 'B', 'B'), 
      ('c1', 'c2', 'c3', 'c4')], names=['lev_0', 'lev_1'])
df_test.to_parquet("c:/users/some_folder/test.parquet")

那段代码的最后一行返回:

ValueError: parquet必须具有字符串列名称

我应该假设不能保存由多个字符串组成的列标题的数据框架吗?谢谢。

-- 数据框架看起来是这样的:

lev_0         A                   B          
lev_1        c1        c2        c3        c4
0      0.713922  0.551404  0.289861  0.178739
1      0.693925  0.425073  0.660924  0.695474
2      0.280258  0.827231  0.282844  0.523069
3      0.424731  0.380963  0.462356  0.491140
4      0.786677  0.102935  0.382453  0.199056
5      0.783115  0.295409  0.236880  0.388399

从pandas 1.2版本开始,这个问题将得到解决。请参见GH34777 - cs95
2个回答

17

pyarrow可以将Pandas的多重索引写入Parquet文件。

import pandas as pd
import numpy as np
import pyarrow.parquet as pq
import pyarrow as pa

df_test = pd.DataFrame(np.random.rand(6,4))
df_test.columns = pd.MultiIndex.from_arrays([('A', 'A', 'B', 'B'), 
      ('c1', 'c2', 'c3', 'c4')], names=['lev_0', 'lev_1'])
table = pa.Table.from_pandas(df_test)
pq.write_table(table, 'test.parquet')

df_test_read = pd.read_parquet('test.parquet')

4
使用内置的pandas.DataFrame.to_parquet函数能否实现多索引处理? - Nyxynyx
3
@cheekybastard 在 pa.Table.from_pandas(df_test) 中的 "pa" 是什么意思? - AleB
@AleB pa是pyarrow: "import pyarrow as pa"。感谢您发现了缺失的导入。 - cheekybastard

10

pandas >= 1.2

自pandas 1.2版本开始,这个问题已经得到了解决,请参见GH34777

pd.__version__
# '1.2.0'

# Writing.
df_test

lev_0         A                   B          
lev_1        c1        c2        c3        c4
0      0.208907  0.875918  0.610843  0.155938
1      0.325854  0.271798  0.916347  0.368343
2      0.650087  0.238840  0.415166  0.218156
3      0.684763  0.075124  0.761239  0.567883
4      0.633933  0.362682  0.214050  0.955370
5      0.561144  0.017972  0.197339  0.251407

# Writes successfully
df_test.to_parquet('test.parquet')

# Reading.
pd.read_parquet('test.parquet')
 
lev_0         A                   B          
lev_1        c1        c2        c3        c4
0      0.208907  0.875918  0.610843  0.155938
1      0.325854  0.271798  0.916347  0.368343
2      0.650087  0.238840  0.415166  0.218156
3      0.684763  0.075124  0.761239  0.567883
4      0.633933  0.362682  0.214050  0.955370
5      0.561144  0.017972  0.197339  0.251407

要运行此代码,您需要一个parquet后端引擎(即pyarrow)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接