Столбец Pandas DataFrames не определяется как числовой - PullRequest
0 голосов
/ 29 мая 2018

Я работал с фреймом данных Pandas, используя файл скрининга кредита репозитория UCI по адресу http://archive.ics.uci.edu/ml/machine-learning-databases/credit-screening/crx.data

Данные содержат некоторые пропущенные значения, и я хочу выполнить другую стратегию вменения в зависимости от типа данныхколонка.Например, если для столбца используется числовое значение, вменяется медиана, но если оно является категориальным, замените категорию, например «Без значения».

Я запускаю этот код для определения числовых столбцов:

#Import data
import pandas as pd
data = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning- 
databases/credit-screening/crx.data', header=None)

#Imputation
import numpy as np
data = data.replace('?', np.nan)
numeric_columns = data.select_dtypes(include=[np.number]).columns

И он возвращает:

Out[67]: Int64Index([2, 7, 10, 14], dtype='int64')

По какой-то причине он не идентифицирует столбец 1 (который явно числовой) как таковой.Я считаю, что причина в том, что в столбце есть некоторые значения NaN, которые делают его не числовым.Кто-нибудь знает, что происходит и что я могу сделать, чтобы обозначить столбец 1 числовым?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Использовать pd.to_numeric с error='ignore':

До, df.info ():

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 690 entries, 0 to 689
Data columns (total 16 columns):
0     678 non-null object
1     678 non-null object
2     690 non-null float64
3     684 non-null object
4     684 non-null object
5     681 non-null object
6     681 non-null object
7     690 non-null float64
8     690 non-null object
9     690 non-null object
10    690 non-null int64
11    690 non-null object
12    690 non-null object
13    677 non-null object
14    690 non-null int64
15    690 non-null object
dtypes: float64(2), int64(2), object(12)
memory usage: 86.3+ KB

Использовать pd.to_numeric:

df = df.replace('?',np.nan)
df = df.apply(lambda x: pd.to_numeric(x,errors='ignore'))

Послевывод, df.info ():

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 690 entries, 0 to 689
Data columns (total 16 columns):
0     678 non-null object
1     678 non-null float64
2     690 non-null float64
3     684 non-null object
4     684 non-null object
5     681 non-null object
6     681 non-null object
7     690 non-null float64
8     690 non-null object
9     690 non-null object
10    690 non-null int64
11    690 non-null object
12    690 non-null object
13    677 non-null float64
14    690 non-null int64
15    690 non-null object
dtypes: float64(4), int64(2), object(10)
memory usage: 86.3+ KB
0 голосов
/ 29 мая 2018

Проблема в том, что data[1] по-прежнему имеет тип dtype object после замены ? на NaN.Однако вы можете просто привести его к плавающему типу одним из двух способов:

Первый - использовать pd.to_numeric с errors='coerce', что приводит к непроанализируемым строкам NaN:

data[1] = pd.to_numeric(data[1], errors='coerce')

Второй - использовать вашу стратегию replace, а затем использовать astype(float):

data = data.replace('?', np.nan)
data[1] = data[1].astype(float)

Оба метода приведут к включению столбца 1 в качестве числового столбца:

numeric_columns = data.select_dtypes(include=[np.number]).columns
>>> numeric_columns
Int64Index([1, 2, 7, 10, 14], dtype='int64')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...