Pandas: DataFrame.quantile的轴参数无效

1 投票
1 回答
2503 浏览
提问于 2025-04-19 00:33

有没有人知道为什么会出现这样的情况?

基本数据:

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

撰写回答