在Pandas中,当使用read_csv()时,如何将NaN分配给不是dtype的值?

时间:2016-10-13 02:55:07

标签: python pandas

注意:请原谅我非常低技能的英语,随时修改问题的标题,或者下面的文字更容易理解

我的代码中有这一行:

moto = pd.read_csv('reporte.csv')

它会发送 DtypeWarning: Columns (2,3,4,5,6,7,8,9,10,12,13) have mixed types. 警告,因此我将其更改为

moto = pd.read_csv('reporte.csv', dtype={'TP': np.float64})

现在它会删除 ValueError: could not convert string to float: 'None'

我用Excel检查了文件(大约200K行),是的,我找到了一些“”值的单元格。

所以我的问题是:有没有办法忽略错误,或强制python用NaN或其他东西填补违规错误?

我尝试了解决方案here,但它没有用。

2 个答案:

答案 0 :(得分:3)

我尝试创建一个csv来复制这个反馈,但不能在pandas 0.18上,所以我只能推荐两种方法来处理这个:

<强>第一

如果你知道你的缺失值都用字符串'none'标记,那么执行以下操作:

moto = pd.read_csv("test.csv", na_values=['none'])

您还可以在na_values列表中添加应转换为NaN的其他标记。

<强>第二

不使用dtype选项再次尝试第一行。

moto = pd.read_csv('reporte.csv')

读取成功,因为您只收到警告。现在执行moto.dtypes以显示哪些列是对象。对于您想要更改的内容,请执行以下操作:

moto.test_column = pd.to_numeric(data.test_column, errors='coerce')

'coerce'选项会将任何有问题的条目(如'none')转换为NaN。

要一次转换整个数据框,可以使用convert_objects。您也可以在单个列上使用它,但不推荐使用该选项而使用to_numeric。选项convert_numeric强制执行NaNs:

moto = moto.convert_objects(convert_numeric=True)

完成上述任何一种方法后,请继续fillna以执行您需要的操作。

答案 1 :(得分:0)

一个很好的答案,wordsmith!只是添加一些小事情:

  • 答案中有错字,data.test_column可能应该是moto.test_column
  • 现在不推荐使用
  • convert_objects,而一次只使用一次针对列的类型特定的方法[为什么?]

一个完整的工作示例,包括删除包含读取错误(不是列计数错误,由read_csv(...,error_bad_lines = False)覆盖的行)将是

moto = pd.read_csv('reporte.csv')
moto.test_column = pd.to_numeric(moto.test_column, errors='coerce')
moto.dropna(axis='index',how='any',inplace=True)

我还想提供一个替代方法:

from pandas import read_csv
import numpy as np

# if the data is not a valid "number", return a NaN
# note that it must be a float, as NaN is a float:  print(type(np.nan))
def valid_float(y):
  try:
    return float(y)
  except ValueError:
    return np.nan

# assuming the first row of the file contains the column names 'A','B','C'...
data = read_csv('test.csv',header=0,usecols=['A','B','D'],
   converters={'A': valid_float, 'B': valid_float, 'D': valid_float} )

# delete all rows ('index') with an invalid numerical entry
data.dropna(axis='index',how='any',inplace=True)

这是非常紧凑的,并且可以同时阅读。对于真正的单行代码,最好(1)将验证函数重写为lambda代码,并且(2)直接在对read_csv的调用中删除有缺陷的行,但是我不知道如何做这两个。