Pandas 1.0+ не может pickle.load dict, содержащий DataFrame с MultiIndex - PullRequest
1 голос
/ 06 мая 2020

Я храню связанные DataFrames, каждый с MultiIndex, в одном dict и обрабатываю его. В Pandas 0.22-0.25 я мог мариновать. Загрузить дикт. Начиная с Pandas 1.0, я не могу: я получаю AttributeError. Судя по странице Pandas 1.0 «Что нового», это могло быть связано с тем, что frozen.py устарел. Вот код воспроизведения:

import pickle
import pandas as pd
import numpy as np

# Create DataFrames and dict
df1 = pd.DataFrame(data=np.ones((2, 2)))
df2 = pd.DataFrame(data=2*np.ones((2, 2)), index=pd.MultiIndex.from_arrays([[1, 2], ['a', 'a']]))
dict12 = {'df1':df1, 'df2':df2}

# Pickle the dict and DataFrames
with open('dict12.pkl', 'wb') as f:
    pickle.dump(dict12, f)
df1.to_pickle('df1.pkl')
df2.to_pickle('df2.pkl')

# Read DataFrames individually
df1 = pd.read_pickle("df1.pkl")
df2 = pd.read_pickle("df2.pkl")

# Read pickled dict
with open("dict12.pkl", "rb") as f:
    dict12 = pickle.load(f)

На Pandas 0.25, df1, df2 и dict12 все считываются / загружаются. Но на Pandas 1.0, df1 и df2 читаются, но dict12 не загружается, и я получаю сообщение об ошибке:

AttributeError: Can't get attribute 'FrozenNDArray' on <module 'pandas.core.indexes.frozen' from 'C:\\Users\\sjp\\Anaconda3\\lib\\site-packages\\pandas\\core\\indexes\\frozen.py'>

Ошибка не зависит от того, что dict имеет несколько ключей. Если вместо этого у нас есть

dict12 = {'df2': df2}
with open('dict12.pkl', 'wb') as f:
    pickle.dump(dict12, f)
with open("dict12.pkl", "rb") as f:
    dict12 = pickle.load(f)

, возникает такая же ошибка. Между тем, когда маринованный dict имеет DataFrame без MultiIndex, нет проблем

dict12 = {'df1': df1}
with open('dict12.pkl', 'wb') as f:
    pickle.dump(dict12, f)
with open("dict12.pkl", "rb") as f:
    dict12 = pickle.load(f)  

Как я могу по-прежнему работать с этим маринованным dict в Pandas 1.0 +?

Обновить

Вышеупомянутое верно, если

  1. Мы используем pickle.dump для dict в Pandas 0.25-
  2. Мы используем pickle.load для dict в Pandas 1.0 +

Однако все работает нормально, если мы оба pickle.dump и pickle.load в одном и том же Pandas (0. или 1.)

Так что действительно вопрос как pickle.load dict, содержащий DataFrame с MultiIndex в Pandas 1.0+, когда dict был маринован в Pandas 0.25 -?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...