Pandas DataFrames 列未被识别为数字
Pandas DataFrames column not being identified as numeric
我正在使用 Pandas 数据框,使用位于 http://archive.ics.uci.edu/ml/machine-learning-databases/credit-screening/crx.data
的 UCI 存储库信用筛选文件
数据包含一些缺失值,我想根据列的数据类型执行不同的插补策略。例如,如果列是数字,则使用中值插补,但如果它是分类,则替换为 "No Value".
等类别
我运行此代码识别数字列:
#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
它 returns:
Out[67]: Int64Index([2, 7, 10, 14], dtype='int64')
出于某种原因,它没有像这样识别第 1 列(显然是数字)。我认为原因是该列中有一些 NaN 值使其看起来不是数字。任何人都知道发生了什么,我该怎么做才能将第 1 列识别为数字?
谢谢!
问题是在将 ?
替换为 NaN
后,data[1]
仍然是 dtype object
。但是,您可以通过以下两种方式之一将其转换为浮动:
第一种是将 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')
将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
我正在使用 Pandas 数据框,使用位于 http://archive.ics.uci.edu/ml/machine-learning-databases/credit-screening/crx.data
的 UCI 存储库信用筛选文件数据包含一些缺失值,我想根据列的数据类型执行不同的插补策略。例如,如果列是数字,则使用中值插补,但如果它是分类,则替换为 "No Value".
等类别我运行此代码识别数字列:
#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
它 returns:
Out[67]: Int64Index([2, 7, 10, 14], dtype='int64')
出于某种原因,它没有像这样识别第 1 列(显然是数字)。我认为原因是该列中有一些 NaN 值使其看起来不是数字。任何人都知道发生了什么,我该怎么做才能将第 1 列识别为数字?
谢谢!
问题是在将 ?
替换为 NaN
后,data[1]
仍然是 dtype object
。但是,您可以通过以下两种方式之一将其转换为浮动:
第一种是将 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')
将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