Ответ 1
Как root упоминается в комментариях, это ограничение Pandas (и Numpy). NaN
- это число с плавающей точкой, и пустые значения, которые у вас есть в вашем CSV, равны NaN.
Это также указано в гочах панд.
Вы можете обойти это несколькими способами.
Для примеров ниже я использовал следующее для импорта данных - обратите внимание, что я добавил строку с пустым значением в столбцы a
и b
import pandas as pd
from StringIO import StringIO
data = """name,a,a1,b,b1
arnold,300311,arnld01,300311,arnld01
sam,300713,sam01,300713,sam01
test,,test01,,test01"""
df = pd.read_csv(StringIO(data), sep=",")
Бросить NaN строки
Первый вариант - удалить строки, содержащие это значение NaN
. Недостатком этого является то, что вы потеряете весь ряд. Получив ваши данные в информационный фрейм, запустите:
df.dropna(inplace=True)
df.a = df.a.astype(int)
df.b = df.b.astype(int)
Это удаляет все строки NaN
из кадра данных, а затем преобразует столбец a
и столбец b
в int
>>> df.dtypes
name object
a int32
a1 object
b int32
b1 object
dtype: object
>>> df
name a a1 b b1
0 arnold 300311 arnld01 300311 arnld01
1 sam 300713 sam01 300713 sam01
Заполните NaN
данными-заполнителями
Эта опция заменит все ваши значения NaN
выбрасываемыми значениями. Это значение нужно определить. Для этого теста я сделал это -999999
. Это позволит использовать оставшиеся данные, преобразовать их в int и сделать очевидным, какие данные являются недействительными. Вы сможете отфильтровать эти строки, если позже будете делать расчеты на основе столбцов.
df.fillna(-999999, inplace=True)
df.a = df.a.astype(int)
df.b = df.b.astype(int)
Это создает фрейм данных примерно так:
>>> df.dtypes
name object
a int32
a1 object
b int32
b1 object
dtype: object
>>> df
name a a1 b b1
0 arnold 300311 arnld01 300311 arnld01
1 sam 300713 sam01 300713 sam01
2 test -999999 test01 -999999 test01
Оставьте значения с плавающей точкой
Наконец, другой выбор - оставить значения с плавающей запятой (и NaN
) и не беспокоиться о нецелочисленном типе данных.