Ответ 1
Проблема вашего примера.
Попытка вашего кода в небольшом масштабе, я замечаю, даже если вы установили dtype=int
, на самом деле вы получите dtype=object
в результирующем фрейме.
header = ['a','b','c']
rows = 11
df = pd.DataFrame(columns=header, index=range(rows), dtype=int)
df.dtypes
a object
b object
c object
dtype: object
Это связано с тем, что, несмотря на то что вы предоставляете функции pd.read_csv
инструкцию, что столбцы dtype=int
, она не может переопределять типы dtypes, которые в конечном итоге определяются данными в столбце.
Это связано с тем, что pandas тесно связан с numpy и numpy dtypes.
Проблема в том, что в созданном фрейме данных нет данных, поэтому numpy по умолчанию присваивает данные np.NaN
, которые не помещаются в целое число.
Это означает, что numpy запутался и по умолчанию возвращается к типу dtype object
.
Проблема объекта dtype.
Наличие dtype, установленного в object
, означает большие накладные расходы в потреблении памяти и времени размещения по сравнению с тем, если вы установили dtype как integer или float.
Обходной путь для вашего примера.
df = pd.DataFrame(columns=header, index=range(rows), dtype=float)
Это работает отлично, поскольку np.NaN
может жить в поплавке. Это дает
a float64
b float64
c float64
dtype: object
И нужно меньше памяти.
Подробнее о том, как относиться к dtypes
См. этот связанный пост для получения более подробной информации о dtype: Pandas параметры read_csv low_memory и dtype