注意:请原谅我非常低技能的英语,随时修改问题的标题,或者下面的文字更容易理解
我的代码中有这一行:
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,但它没有用。
答案 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!只是添加一些小事情:
一个完整的工作示例,包括删除包含读取错误(不是列计数错误,由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的调用中删除有缺陷的行,但是我不知道如何做这两个。