Я работаю с довольно большим набором данных (более 4 ГБ), который я импортировал в pandas
. Достаточно некоторые столбцы в этом наборе данных - это простые индикаторы True/False, и, естественно, наиболее экономичный способ их хранения будет использовать bool
dtype для этого столбца. Однако в столбце также содержатся некоторые значения NaN, которые я хочу сохранить. Прямо сейчас это приводит к тому, что столбец имеет dtype float (со значениями 1.0
, 0.0
и np.nan
) или объект, но они оба используют слишком много памяти.
В качестве примера:
df = pd.DataFrame([[True,True,True],[False,False,False],
[np.nan,np.nan,np.nan]])
df[1] = df[1].astype(bool)
df[2] = df[2].astype(float)
print(df)
print(df.memory_usage(index=False, deep=True))
print(df.memory_usage(index=False, deep=False))
приводит к
0 1 2
0 True True 1.0
1 False False 0.0
2 NaN True NaN
0 100
1 3
2 24
dtype: int64
0 24
1 3
2 24
dtype: int64
Что было бы самым эффективным способом хранения таких значений, зная, что они могут принимать только 3 разных значения: True
, False
и <undefined>
Использовать dtype: int8
1 = True
0 = False
-1 = NaN
Это в 4 раза лучше, чем float32
и в 8 раз лучше, чем float64