Pandas: DataFrame.quantile的轴参数无效
有没有人知道为什么会出现这样的情况?
基本数据:
In [1]: tmc_sum.head(6)
Out [1]: 1 2 3 8 9 10
tmc
110+05759 7469 7243 7307 7347 7271 7132
110P05759 7730 7432 7482 7559 7464 7305
110+05095 7256 6784 6697 6646 6786 6530
110P05095 0 0 0 0 0 0
110+05096 6810 5226 5625 5035 5064 4734
110P05096 6854 5041 5600 5308 5261 4747
前言:
根据quantile的文档,这个是正确的:
In [2]: tmc_sum.quantile(0.05, axis=1)
Out [2]: 1 3347.50
2 1882.40
3 1933.10
8 1755.00
9 1554.15
10 1747.85
dtype: float64
它正确地计算了每一列的第5百分位数。(注意,实际上列的数量比上面打印的六个要多。)
问题:
但是这个却没有按预期工作:
In [3]: tmc_sum.quantile(0.05, axis=0)
Out [3]: 1 3347.50
2 1882.40
3 1933.10
8 1755.00
9 1554.15
10 1747.85
dtype: float64
它依然是按列来计算的。虽然根据文档,它应该是按行来计算的。所以我本来期待会得到这样的结果:
In [4]: tmc_sum.apply(lambda x: np.percentile(x, 0.05), axis=1).head(6)
Out [4]: tmc
110+05759 7132.2775
110P05759 7305.3175
110+05095 6530.2900
110P05095 0.0000
110+05096 4734.7525
110P05096 4747.7350
这种行为是正常的吗?我是不是漏掉了什么,还是说这是个bug?
1 个回答
5
在0.14.0版本中有个bug(axis这个关键词被忽略了),在0.14.1版本中已经修复了(可以查看这个链接:https://github.com/pydata/pandas/pull/7312)
如果你不能升级版本,可以用 df.T.quantile(0.5)
来实现你想要的效果。
顺便说一下,axis=1
的情况是不正确的。默认的axis=0
是计算不同列的分位数,而axis=1
是“沿着列”计算每一行的分位数。举个简单的例子,考虑:
In [3]: df
Out[3]:
a b c
0 0 1 2
1 3 4 5
默认的axis=0
:
In [4]: df.quantile(0.5, axis=0)
Out[4]:
a 1.5
b 2.5
c 3.5
dtype: float64
而使用axis=1
:
In [5]: df.quantile(0.5, axis=1)
Out[5]:
0 1
1 4
dtype: float64