使用numpy/scipy如何处理缺失数据?

11

在数据清洗中,我经常处理的问题之一是缺失值。R使用其"NA"缺失数据标签来处理这个问题。在Python中,似乎我必须处理掩码数组,这似乎很麻烦并且没有得到很好的记录。你有什么建议可以使Python中这个过程更容易吗?这对于我将Python用于数据分析来说成为了一个决定性因素。谢谢。

更新 显然我已经有一段时间没有查看numpy.ma模块中的方法了。似乎至少对于掩码数组,基本的分析函数是可用的,并且提供的示例帮助我了解了如何创建掩码数组(感谢作者)。我想看看Python中的一些新的统计方法(在今年的GSoC中开发)是否包含这个方面,至少进行了完整的情况分析。


为什么不使用numpy.NaN来标识缺失的数据? - Paul
4个回答

4
如果您考虑使用库,pandas (http://pandas.pydata.org/) 是建立在numpy之上的一种库,它能提供许多功能,其中包括: 智能数据对齐和集成处理丢失数据:在计算中获得自动基于标签的对齐,并轻松地将混乱的数据转换成有序形式。 我已经在金融行业使用了近一年的时间,其中丢失和不良对齐的数据是常态,pandas较大地方便了我的工作。

1

请参见sklearn.preprocessing.Imputer

import numpy as np
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
X = [[np.nan, 2], [6, np.nan], [7, 6]]
print(imp.transform(X))  

来自http://scikit-learn.org/的示例


1

我也对掩码数组的问题感到疑惑。以下是一些例子:

import numpy as np
data = np.ma.masked_array(np.arange(10))
data[5] = np.ma.masked # Mask a specific value

data[data>6] = np.ma.masked # Mask any value greater than 6

# Same thing done at initialization time
init_data = np.arange(10)
data = np.ma.masked_array(init_data, mask=(init_data > 6))

1

掩码数组是答案,正如DpplerShift所描述的那样。对于快速而简单的使用,您可以使用布尔数组进行花式索引:

>>> import numpy as np
>>> data = np.arange(10)
>>> valid_idx = data % 2 == 0 #pretend that even elements are missing

>>> # Get non-missing data
>>> data[valid_idx]
array([0, 2, 4, 6, 8])

现在您可以将valid_idx作为快速掩码应用于其他数据

>>> comparison = np.arange(10) + 10
>>> comparison[valid_idx]
array([10, 12, 14, 16, 18])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接