Я создаю небольшой DataFrame Pandas и добавляю в него некоторые данные, которые должны быть целыми числами. Но даже несмотря на то, что я очень стараюсь явно установить dtype в int и предоставлять только значения int, он всегда становится плавающим. Это не имеет никакого смысла для меня вообще, и поведение даже не кажется полностью последовательным.
Рассмотрим следующий скрипт Python:
import pandas as pd
df = pd.DataFrame(columns=["col1", "col2"]) # No dtype specified.
print(df.dtypes) # dtypes are object, since there is no information yet.
df.loc["row1", :] = int(0) # Add integer data.
print(df.dtypes) # Both columns have now become int64, as expected.
df.loc["row2", :] = int(0) # Add more integer data.
print(df.dtypes) # Both columns are now float64???
print(df) # Shows as 0.0.
# Let's try again, but be more specific.
del df
df = pd.DataFrame(columns=["col1", "col2"], dtype=int) # Explicit set dtype.
print(df.dtypes) # For some reason both colums are already float64???
df.loc["row1", :] = int(0)
print(df.dtypes) # Both colums still float64.
# Output:
"""
col1 object
col2 object
dtype: object
col1 int64
col2 int64
dtype: object
col1 float64
col2 float64
dtype: object
col1 col2
row1 0.0 0.0
row2 0.0 0.0
col1 float64
col2 float64
dtype: object
col1 float64
col2 float64
dtype: object
"""
Я могу это исправить, выполнив df = df.astype(int)
в конце. Есть и другие способы исправить это. Но это не должно быть необходимым. Я пытаюсь выяснить, что я делаю неправильно, что делает колонки плавающими.
Что происходит?
Python версия 3.7.1
Панды версия 0.23.4
EDIT:
Я думаю, может быть, некоторые люди неправильно понимают. В этом DataFrame никогда не бывает значений NaN. Сразу после его создания это выглядит так:
Empty DataFrame
Columns: [col1, col2]
Index: []
Это пустой Dataframe, df.shape = 0, но в нем нет NaN, просто еще нет строк.
Я также обнаружил кое-что еще хуже. Даже если я добавлю df = df.astype(int)
после добавления данных так, чтобы они стали целыми, он снова станет плавающим, как только я добавлю больше данных !
df = pd.DataFrame(columns=["col1", "col2"], dtype=int)
df.loc["row1", :] = int(0)
df.loc["row2", :] = int(0)
df = df.astype(int) # Force it back to int.
print(df.dtypes) # It is now ints again.
df.loc["row3", :] = int(0) # Add another integer row.
print(df.dtypes) # It is now float again???
# Output:
"""
col1 int32
col2 int32
dtype: object
col1 float64
col2 float64
dtype: object
"""
Предлагаемое исправление в версии 0.24 не похоже на мою проблему. Эта особенность относится к типу данных Nullable Integer. В моих данных нет значений NaN или None.