Python 优雅地处理非数字元素

Python 优雅地处理非数字元素,python,python-2.7,numpy,pandas,scipy,Python,Python 2.7,Numpy,Pandas,Scipy,我试图在数据帧和列表上运行scipys-hstack方法。为了有效地做到这一点,我必须处理列表中的非数字元素。我希望在运行中尽可能优雅地完成这项工作(即,我不希望编辑我正在阅读的csv) 我正在运行的代码如下所示: X = list(np.array(p.read_csv('CSVFile.csv', delimiter=";"))[:,2]) OtherColumn = p.read_csv('CSVFile.csv', delimiter=";")[["OtherCol"]]

我试图在数据帧和列表上运行scipys-hstack方法。为了有效地做到这一点,我必须处理列表中的非数字元素。我希望在运行中尽可能优雅地完成这项工作(即,我不希望编辑我正在阅读的csv)

我正在运行的代码如下所示:

  X = list(np.array(p.read_csv('CSVFile.csv', delimiter=";"))[:,2])
  OtherColumn = p.read_csv('CSVFile.csv', delimiter=";")[["OtherCol"]]

  X =  sp.sparse.hstack((X, OtherColumn.values))
错误:

TypeError: no supported conversion for types: (dtype('float64'), dtype('O')
这是因为我的
OtherColumn
列包含一个“?”字符,其中包含错误数据。我需要的逻辑如下,但如何在Python中实现这一点?抱歉,我是个初学者,已经为此挣扎了一段时间了

for(i = 0; i< OtherColumn.size; i++)){
    try:
        X[i] =  sp.sparse.hstack((X[i], OtherColumn.values[i]))
    except Error:
        X[i] =  sp.sparse.hstack((X[i], OtherColumn.avg()))
    }
for(i=0;i

在英语中,除非有“?”字符,否则运行正常的hstack,然后使用所有其他列值的平均值。

解决此问题的最干净方法可能是在
读取csv
中指定“?”作为缺少的数据标记:

df = p.read_csv('CSVFile.csv', delimiter=";", na_values=['?'])[["OtherCol"]]
另外,我不明白为什么需要所有的数组转换和堆叠。为什么不直接将文件读入数据帧,然后执行所需的操作呢?看起来你只是想

df['NewColumn'] = df.OtherColumn.fillna(df.OtherColumn.mean())

您认为您可以这样做:
X=sp.sparse.hstack((X,[value for value in OtherColumn.values if value!=“?”])
if type(value)!=str
,类似于这样的内容您可以将
na_values=['?']
作为参数传递给
read_csv
@behzad.nouri您能给我链接一个这样做对我有帮助的示例吗?是否可以通过这种方式将na_值设置为整个
数据帧的最大值或平均值?@SimonKiely如果列只有数值和缺少的值,pandas将自动正确获取类型;当
“?”
混合在一起时,列将被解析为一个对象,因此您需要指定
na_值=[“?”]
,以便
“?”
被解析为缺少的值没有问题,只需注意,通常您不必这样做。对于大多数计算,Pandas会对缺少的值做正确的处理,将它们保留在其中可以更容易地计算每列中的有效数据点并计算正确的分布。@这太棒了。非常感谢。我说的应该是
df.fillna(df.OtherColumn.mean())
而不是
df.OtherColumn.fillna(df.OtherColumn.mean())
对吗?只是在我试着运行它时的一个快速观察;对我来说似乎是这样的!:)谢谢:)df.fillna将对所有列执行此操作,而df.OtherColumn.fillna将仅对该列执行此操作。如果你想用每个平均值填充每个列,使用DF.fILNA(DF.Mead())。如果你找到这个答案来解决你的问题,考虑把它标记为答案。