2014-05-08 94 views
4

我很难理解大熊猫和/或numpy是如何处理NaN值的。我正在提取熊猫数据帧的子集以便计算t-stats,例如我想知道x1值为A的组与x1值为B的组相比x2的平均值是否存在显着差异(道歉为不使这是一个工作示例,但我不知道如何重新在我的数据框弹出NaN值,原来的数据被读取使用read_csv,用CSV表示与NA遗漏值):NaN的治疗

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 

应该如何缺失的值,以确保我仍然可以做的计算与系列/阵列可以治疗吗?

回答

5

pandas使用与bottlenecknanmean函数相同的代码,我相信这样会自动忽略nan s。 numpy不适合你。你真正想做的事,但是,是掩盖nan - 值两个系列,并传递给t检验:

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

谢谢,这个工作很完美,只有'n'''''''似乎只有在'A'和'B'具有相同大小时才能工作,所以我只用了一行'st.ttest_ind(A [np (A)],B [np.isfinite(B)])' –

1

ttest_ind需要一个名为“nan_policy”是决定NaN是如何处理的参数。默认情况下,如果输入中的任何值为nan,则nan_policy将“传播”,导致nan。如果有任何输入为“nan”,“raise”将会引发错误。 “省略”忽略南。

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

应该给你一个non-nan结果。