如何将多索引熊猫数据帧保存到镶木地板中?

tec*_*ife 5 pandas 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")
Run Code Online (Sandbox Code Playgroud)

该代码的最后一行返回:

ValueError:拼花地板必须具有字符串列名称

我是否应该假设我无法保存由(字符串的)多索引创建的列标题的数据框?谢谢。

-数据框如下所示:

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
Run Code Online (Sandbox Code Playgroud)

che*_*ard 14

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')
Run Code Online (Sandbox Code Playgroud)

  • 可以使用内置的“pandas.DataFrame.to_parquet”实现多索引处理吗? (3认同)
  • @cheekybastard `pa.Table.from_pandas(df_test)` 中的 pa 是什么? (3认同)

cs9*_*s95 10

熊猫 >= 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')
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)

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