我在向我的pandas数据帧添加多索引时遇到了这个问题。我正在使用带有选项format='table'
的pandas HDFStore,这是我更喜欢的,因为保存的数据框在不使用pandas时更容易理解和加载。 (有关详细信息,请参阅此答案:Save pandas DataFrame using h5py for interoperabilty with other hdf5 readers。)
但我遇到了一个问题,因为我在调用set_index时使用drop=False
设置了多索引,这使索引列保持为dataframe列。在我使用format='table'
将数据框放到商店之前,这很好。使用format='fixed'
工作正常。但是format='table'
给了我一个错误的重复列名。我在放置和恢复列之后删除冗余列,从而避免了错误。
这是我现在使用的写/读对函数:
def write_df_without_index_columns(store, name, df):
if isinstance(df.index, pd.MultiIndex):
# drop any columns that are duplicates of index columns
redundant_columns = set(df.index.names).intersection(set(df.columns))
if redundant_columns:
df = df.copy(deep=True)
df.drop(list(redundant_columns), axis=1, inplace=True)
store.put(name, df,
format='table',
data_columns=True)
def read_df_add_index_columns(store, name, default_value):
df = store.get(name)
if isinstance(df.index, pd.MultiIndex):
# remember the MultiIndex column names
index_columns = df.index.names
# put the MultiIndex columns into the data frame
df.reset_index(drop=False, inplace=True)
# now put the MultiIndex columns back into the index
df.set_index(index_columns, drop=False, inplace=True)
return df
我的问题:有更好的方法吗?我希望有一个包含数百万行的数据框,所以我不希望这个效率太低。