治疗NaN's

时间:2014-05-08 13:38:53

标签: python numpy nan

我无法理解pandas和/或numpy如何处理NaN值。我正在提取大熊猫数据帧的子集,以便计算t-stats,例如我想知道x1值为A的组的x2平均值与x1值为B的组的平均值是否存在显着差异(请注意,这不是一个有效的例子,但我不知道如何重新创建在我的数据框中弹出的NaN值,使用read_csv读取原始数据,csv用NA表示缺失值:

import numpy as np
import pandas as pd
import scipy.stats as st
A = data[data['x1']=='A']['x2']
B = data[data['x1']=='B'].x2
A

2      3
3      1
5      2
6      3
10     3
12     2
15     2
16     0
21     0
24     1
25     1
28   NaN
31     0
32     3
...
677     0
681   NaN
682     3
683     1
686     2
Name: praxiserf, Length: 335, dtype: float64

也就是说,我有两个pandas.core.series.Series个对象,然后我想对它进行t检验。但是,使用

st.ttest_ind(A, B)

返回:

(array(nan), nan)

我认为这与ttest_ind接受数组作为输入这一事实有关,而且在将系列转换为数组时,我的NaN值似乎存在问题。如果我尝试计算原始系列的方法,我得到:

A.mean(), B.mean()

1.5802, 1.2

但是,当我尝试将系列变成数组时,我得到:

A_array = np.asarray(A)
A_array

array([ 3., 1., 2., 3., 3., 2., 2., 0., 0., 1., 1.,
        nan, 0., 3., ..., 1., nan, 0., 3. ])

也就是说,NaN变成了nan并且采取手段不再有效:

A.mean()

nan

如何处理缺失值以确保我仍然可以使用系列/数组进行计算?

2 个答案:

答案 0 :(得分:5)

我相信,

pandas使用与bottleneck nanmean函数相同的代码,因此会自动忽略nannumpy并没有为您做到这一点。但是,你真正想要做的是掩盖nan - 两个系列中的值并将其传递给t检验:

mask = numpy.logical_and(numpy.isfinite(A), numpy.isfinite(B))
st.ttest_ind(A[mask], B[mask])

答案 1 :(得分:1)

ttest_ind采用一个名为" nan_policy"的参数。这决定了如何对待nans。默认情况下,nan_policy是"传播"如果输入中的任何值是nan,则导致nan。 "提高"如果任何输入为nan,则会引发错误。 "省略"无视南。

st.ttest_ind(A, B, nan_policy="omit")

应该给你一个非纳米的结果。