熊猫分位数因NaN存在而失败

时间:2014-06-04 19:48:55

标签: python-2.7 pandas quantile

我在计算四分位数范围时遇到了一个有趣的情况。假设我们有一个数据框,例如:

import pandas as pd
index=pd.date_range('2014 01 01',periods=10,freq='D')
data=pd.np.random.randint(0,100,(10,5))
data = pd.DataFrame(index=index,data=data)

data
Out[90]: 
             0   1   2   3   4
2014-01-01  33  31  82   3  26
2014-01-02  46  59   0  34  48
2014-01-03  71   2  56  67  54
2014-01-04  90  18  71  12   2
2014-01-05  71  53   5  56  65
2014-01-06  42  78  34  54  40
2014-01-07  80   5  76  12  90
2014-01-08  60  90  84  55  78
2014-01-09  33  11  66  90   8
2014-01-10  40   8  35  36  98

# test for q1 values (this works)
data.quantile(0.25)
Out[111]: 
0    40.50
1     8.75
2    34.25
3    17.50
4    29.50

# break it by inserting row of nans
data.iloc[-1] = pd.np.NaN

data.quantile(0.25)
Out[115]: 
0    42
1    11
2    34
3    12
4    26

第一个四分位数可以通过计算数据框中低于总体中位数的值的中位数来计算,因此我们可以看到data.quantile(0.25)应该产生什么。例如

med = data.median()
q1  = data[data<med].median()
q1
Out[119]: 
0    37.5
1     8.0
2    19.5
3    12.0
4    17.0

似乎分位数不能提供q1等的适当表示,因为它没有很好地处理NaN值(即它没有NaN,但没有NaNs)。

我认为这可能不是“NaN”问题,而是分位数可能无法处理偶数数据集(即中位数必须计算为两个中心数的平均值)。但是,在使用偶数行和奇数行的数据帧进行测试后,我看到分位数正确地处理了这些情况。只有当数据帧中存在NaN值时,才会出现问题。

我想使用quntile来计算我的数据帧中的滚动q1 / q3值,但是,这不适用于NaN的存在。有人能为这个问题提供解决方案吗?

1 个答案:

答案 0 :(得分:3)

在内部,quantile使用numpy.percentile覆盖非空值。当您将data的最后一行更改为NaNs时,您在第一列中基本上留下了数组array([ 33., 46., 71., 90., 71., 42., 80., 60., 33.])

计算np.percentile(array([ 33., 46., 71., 90., 71., 42., 80., 60., 33.])得到42。

来自docstring:

  

给定长度为N的向量V,V的第q个百分位数是排名第q的   V的排序副本中的值。最近的两个加权平均值   如果归一化排名与q完全不匹配,则使用邻居。   与q=50的中位数相同,与q=0的最小值相同   与q=100的最大值相同。