【问题标题】:Pandas DataFrames column not being identified as numericPandas DataFrames 列未被识别为数字
【发布时间】:2018-11-08 08:37:53
【问题描述】:

我正在使用 Pandas 数据框,使用位于 http://archive.ics.uci.edu/ml/machine-learning-databases/credit-screening/crx.data 的 UCI 存储库信用筛选文件

数据包含一些缺失值,我想根据列的数据类型执行不同的插补策略。例如,如果该列是数字,则使用中值估算,但如果它是类别替换,例如“无值”。

我运行此代码来识别数字列:

#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 列识别为数字?

谢谢!

【问题讨论】:

  • 当您尝试data[0].dype 时会看到什么?如果不是数字,请尝试:data[0] = pd.to_numeric(data[0], errors='coerce')
  • 我收到dtype('O'),这是什么意思?我可以手动进行 to_numeric 转换,但我希望算法以编程方式进行。
  • dtype('O') 表示对象,表示可能有字符串或任意类型。您将需要转换。

标签: python pandas numpy dataframe imputation


【解决方案1】:

问题是data[1] 在将? 替换为NaN 后仍然是dtype object。但是,您可以通过以下两种方式之一将其转换为浮动:

第一种是将pd.to_numericerrors='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')

【讨论】:

    【解决方案2】:

    pd.to_numericerror='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
    

    【讨论】:

    • 谢谢!这很完美,正是我想要的。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多