Как преобразовать категориальные столбцы в целочисленные столбцы в python? (с NaN) - PullRequest
2 голосов
/ 20 января 2020

Мой фрейм данных ниже.

id  gender  region  income  a1  a2  a3  a4  a5  a6  a7  a8  a9  a10
1   male    N        300    NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2   female  S        500    7   10  10  10  6   6   6   8   5   9
3   male    E        200    6   NaN 9   6   6   NaN 7   7   7   9
4   female  W        100    9   7   7   NaN 7   8   8   8   NaN 5

Я хочу изменить тип данных, категоричный на целочисленный, для нескольких столбцов. (a1 ~ a10) Итак, я попробовал приведенный ниже код, но произошла ошибка, как показано ниже

df.iloc[:, 4: ].astype('int')

ValueError: невозможно преобразовать число с плавающей запятой в целое число

Как я могу скрыть это?

Спасибо.

Ответы [ 5 ]

1 голос
/ 20 января 2020

Если возможно использование pandas 0,24+, используйте Целочисленный тип данных Nullable , также необходим .astype(float) для преобразования категориальных столбцов в числа:

df.iloc[:, 4: ] = df.iloc[:, 4: ].astype(float).astype("Int64")
print (df)
   id  gender region  income   a1   a2   a3   a4   a5   a6   a7   a8   a9  a10
0   1    male      N     300  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
1   2  female      S     500    7   10   10   10    6    6    6    8    5    9
2   3    male      E     200    6  NaN    9    6    6  NaN    7    7    7    9
3   4  female      W     100    9    7    7  NaN    7    8    8    8  NaN    5

При необходимости замените отсутствующие значения по наиболее частым значениям в столбцах:

df.iloc[:, 4: ] = df.iloc[:, 4: ].fillna(df.iloc[:, 4: ].mode().iloc[0]).astype(int)

print (df)
   id  gender region  income  a1  a2  a3  a4  a5  a6  a7  a8  a9  a10
0   1    male      N     300   6   7   7   6   6   6   6   8   5    9
1   2  female      S     500   7  10  10  10   6   6   6   8   5    9
2   3    male      E     200   6   7   9   6   6   6   7   7   7    9
3   4  female      W     100   9   7   7   6   7   8   8   8   5    5
1 голос
/ 20 января 2020

По умолчанию pandas преобразовать столбцы с np.nan как float

Для pandas версия 0.24.0 и выше

Преобразовать необходимые столбцы в тип данных Int8 который может иметь np.nan значения

columns = ["A1","A2","A3","A4","A5","A6","A7","A8","A9","A10"]

df[columns] = df[columns].astype("Int8")

print(df.dtypes)

См. Эту документацию

Альтернативное решение

вы можете заменить np.nan на mode каждого столбца, а затем преобразовать их в int

for c in columns:
    x = df[c].mode()
    x = list(x)[0]
    df[c] = df[c].fillna(x).astype("int")
0 голосов
/ 20 января 2020

предполагается, что в столбцах A1-A3 нет нулевого значения

cleanup_nums = {"A1":{"Apple":1, "Samsung":2}}
df.replace(cleanup_nums,inplace=True)

подробности функции replace могут относиться к https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.replace.html.

Там также учебники для кодирования категориальных значений в python. https://pbpython.com/categorical-encoding.html

0 голосов
/ 20 января 2020

Привет, вы можете следовать нижеприведенному подходу:

Это заполнит значения NaN 0, поэтому тип будет int.

df.fillna(value=int(), inplace=True)

или

Это заполнит значения NaN <class 'int'>, это также тип int.

df.fillna(value=int, inplace=True)
0 голосов
/ 20 января 2020

Вы должны перейти к выбрасыванию или заполнить до.

#will remove line with Nan inside
df.dropna(inplace=True)

Или

#will replace Nan by a value e.g "- 1" 
df.fillna(-1,inplace=True)
...