Я храню связанные 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 +?
Обновить
Вышеупомянутое верно, если
- Мы используем pickle.dump для dict в Pandas 0.25-
- Мы используем 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 -?