Pandas, целочисленная переменная становится плавающей, если содержит Nan - PullRequest
1 голос
/ 07 августа 2020

Хотя в ОС ведется много дискуссий, в которых упоминается возможность использования целого числа Nan, которое было добавлено к Pandas начиная с 0,24, но когда я читаю файл csv , используя read_csv(), он снова обнаруживает integer значение, которое содержит Nan as float.

Я делаю что-то не так или это нормальное поведение? Если да, то что можно исправить?

все, что важно, чтобы в моем случае использования я мог правильно определять тип переменной

1 Ответ

2 голосов
/ 07 августа 2020

Если вы используете astype(), это работает.

df = pd.DataFrame({"intwithnan":[random.randint(0,100) 
                                 if random.randint(0,3)<2 else np.nan 
                                 for i in range(20)]}).astype({"intwithnan":"Int64"})
df.to_csv("nan.csv", index=False)
df = pd.read_csv("nan.csv").astype({"intwithnan":"Int64"})
print(f"{df.dtypes}\n\n{df.to_string(index=False)}")

вывод

intwithnan    Int64
dtype: object

 intwithnan
         97
         97
         66
         16
       <NA>
       <NA>
       <NA>
         59
         23
       <NA>
       <NA>
         95
         61
       <NA>
         26
         13
       <NA>
         48
         84
         19

дополнительный

Если вы не знаете свой столбцы, но вы хотите попытаться преобразовать их в Int64

df = pd.DataFrame({"intwithnan":[random.randint(0,100) 
                                 if random.randint(0,3)<2 else np.nan 
                                 for i in range(20)],
                  "stringcol":["abc" for i in range(20)]}).astype({"intwithnan":"Int64"})
df.to_csv("nan.csv", index=False)
df = pd.read_csv("nan.csv")
for c in df.columns:
    try: df = df.astype({c:"Int64"})
    except TypeError: pass
print(f"{df.dtypes}\n\n{df.to_string(index=False)}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...