为什么pandas中的“rank”百分位数没有被限制在0到1之间?

3

我经常使用pandas,并经常执行类似以下代码的程序:

df['var_rank'] = df['var'].rank(pct=True)
print( df.var_rank.max() )

我经常得到大于1的值,无论我保留还是删除'na'值。这很容易解决(只需用最大排名的值进行除法),所以我不需要一个变通方法。我只是好奇为什么会发生这种情况,而且在网上没有找到任何线索。

有人知道为什么会这样吗?

这里有一些非常简单的示例数据(Dropbox链接 - 采用Pickled Pandas Series格式)

我从df.rank(pct=True).max()中获得1.0156的值。我曾有其他数据高达4或5。我通常使用相当混乱的数据。


1
请问你能否发布一些样本数据,使得值大于1? - Alex Riley
编辑了问题,并附上了一些数据的链接。 - benten
1个回答

1

你的数据有误。

>>> s.rank(pct=True).max()
1.015625

s.sort(inplace=True)
>>> s.tail(7)
8      202512882
6      253661077
102            -
101            -
99             -
58             -
116            -
Name: Total Assets, dtype: object

>>> s[s != u'-'].rank(pct=True).max()
1.0

在上周发布的Pandas 0.18.0中,您可以指定仅为数字
s.rank(pct=True, numeric_only=True)

我在0.18.0版本中尝试了上述方法,但似乎无法使其正常工作,因此您还可以使用以下方法对所有浮点数和整数值进行排序:

>>> s[s.apply(lambda x: isinstance(x, (int, float)))].rank(pct=True).max()
1.0

它创建一个布尔掩码,确保每个值都是整数或浮点数,然后对过滤后的结果进行排名。

我认为这些非数字观测值是导致此问题的原因,但我的直觉告诉我,这些条目将使百分位数低于1(例如,如果一半数据有问题,则我的最高排名观测值将为0.5)。无论如何,了解更新信息很好。 - benten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接