pd.read_csv по умолчанию обрабатывает целые числа, такие как float

У меня есть csv который выглядит (заголовки = первая строка):

name,a,a1,b,b1
arnold,300311,arnld01,300311,arnld01
sam,300713,sam01,300713,sam01

Когда я запускаю:

df = pd.read_csv('file.csv')

Столбцы a и b имеют .0 прикрепленные к концу следующим образом:

df.head()

name,a,a1,b,b1
arnold,300311.0,arnld01,300311.0,arnld01
sam,300713.0,sam01,300713.0,sam01

Столбцы a и b являются целыми числами или пробелами, поэтому почему pd.read_csv() обрабатывает их как float и как я могу обеспечить их целые числа при чтении?

Ответы

Ответ 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) и не беспокоиться о нецелочисленном типе данных.

Ответ 2

Преобразование значений с плавающей точкой в целочисленные с использованием Pandas read_csv - Работает ============================================ ============

# Importing the dataset
dataset = pd.read_csv('WorldWarWeather_Data.csv')
X = dataset.iloc[:, 3:11].values
y = dataset.iloc[:, 2].values
X=X.astype(int)
y=y.astype(int)