如何向下转换整数多索引级别?

2024-10-01 09:25:47 发布

您现在位置:Python中文网/ 问答频道 /正文

  1. 我有一个大规模多索引系列的字典,其中两个索引级别都是日期时间值。 其中一个抽象的简短示例是:
idx_level_0 = pd.date_range('2020-01-01', '2020-04-01', freq = 'M')
idx_level_1 = pd.date_range('2020-04-01', '2020-07-01', freq = 'M')
idx_dates = pd.MultiIndex.from_product([idx_level_0, idx_level_1], names = ['Event_Date', 'Observation_Date'])
ser_info_dated = pd.Series(range(len(idx_level_0) * len(idx_level_1)), index = idx_dates, name = 'Some_Values') / 33
  1. 我需要保存所有数据,所以我选择将每个系列分别导入到公共HDF5文件中,并使用dictionary键作为hdf键。当我将其保存为原样时,我的文件卷大约为4GB,因此我正在尝试使其更薄。此外,我还需要跨索引处理所有系列数据,所以我需要一些全局标识方法。 我的想法是从所有系列中的两个级别共同收集日期(大约有11000个唯一日期),并用唯一编号标识符替换它,以便有机会恢复所有系列的原始索引。但只有当我能够将数值转换为int16类型时,它才有意义。 因此,我尝试了这样一个序列(这里我将其简化为单个系列):
list_levels_dates = sorted(list(set(idx_level_0) | set(idx_level_1)))
dict_to_numbers = dict(zip(list_levels_dates, range(len(list_levels_dates))))
df_info_numbered = ser_info_dated.reset_index().replace({'Event_Date': dict_to_numbers, 'Observation_Date': dict_to_numbers})
df_info_downcasted = df_info_numbered.copy()
df_info_downcasted[['Event_Date', 'Observation_Date']] = df_info_downcasted[['Event_Date', 'Observation_Date']].astype('int16')

这似乎是一个成功:

print('df_info_downcasted column types:\n', df_info_downcasted.dtypes)

结果表明:

df_info_downcasted column types:
Event_Date            int16
Observation_Date      int16
Some_Values         float64
  1. 但当我将列移回索引级别时,它又变为int64:
ser_info_downcasted = df_info_downcasted.set_index(['Event_Date', 'Observation_Date']).squeeze()
print('ser_info_downcasted index level 0 type: ', ser_info_downcasted.index.levels[0].dtype)
print('ser_info_downcasted index level 1 type: ', ser_info_downcasted.index.levels[1].dtype)
ser_info_downcasted index level 0 type:  int64
ser_info_downcasted index level 1 type:  int64
  1. 我尝试了其他操作,但也失败了:
ser_info_astyped = ser_info_downcasted.copy()
ser_info_astyped.index = ser_info_astyped.index.set_levels(ser_info_astyped.index.levels[0].astype('int16'), level = 0)
ser_info_astyped.index = ser_info_astyped.index.set_levels(ser_info_astyped.index.levels[1].astype('int16'), level = 1)
print('ser_info_astyped index level 0 type: ', ser_info_astyped.index.levels[0].dtype)
print('ser_info_astyped index level 1 type: ', ser_info_astyped.index.levels[1].dtype)
ser_info_astyped index level 0 type:  int64
ser_info_astyped index level 1 type:  int64
  1. 因此,我非常需要一个建议,如何显式地将整数类型转换为较短的类型,或者其他建议,如何缩短系列卷。我还尝试将所有系列附加到一个大型系列中,但这会引发内存错误

Tags: infoeventdfdateindextypelevelser