首页 > 解决方案 > 如何确定数据框中的哪一行具有最均匀和最高的分布

问题描述

我想按分布最均匀但值也很高的行对熊猫数据框进行排序。例如:

行 属性 1 属性 2 属性 3
1 1 108
b 10 2 145
c 50 60 55
d 100 90 120
20 25 23
f 1000 30 0

d 和 c 行应该排名最高,理想情况下,d 排在 c 之后。

我考虑使用标准偏差来确定最均匀的分布,然后意味着获得最高的平均值,但我不确定如何将它们组合在一起。

标签: pythonpandasdataframedistribution

解决方案


由于您提到的“均匀分布”的感知似乎很主观,这里有一个实现@ALollz 提到的变异系数的指令。

df.std(axis=1) / df.mean(axis=1)

Row 0
a   1.6848130582715446
b   1.535375387727906
c   0.09090909090909091
d   0.14782502241793033
e   0.11102697698927574
f   1.6569547684031352

该指标是由标准差表示的平均值的百分比。如果您的行平均值为 10,标准差为 1,则比率将为 10% 或 0.1

在此示例中,可以认为最“均匀分布”的行是 c 行:其平均值为 55,标准差为 5。因此该比率约为 9%。

这样,您可以对分布的同质性有一个不错的概述。

如果你想要排名,你可以申请.sort_values

(df.std(axis=1) / df.mean(axis=1)).sort_values()
Row 0
c   0.09090909090909091
e   0.11102697698927574
d   0.14782502241793033
b   1.535375387727906
f   1.6569547684031352
a   1.6848130582715446

我的最后一句话是不要被我们大脑的感知所迷惑:它很容易被统计数据所欺骗。

现在,如果您想改善较高值的结果,可以将此系数除以平均值:平均值越高,系数越低。

(df.std(axis=1) / df.mean(axis=1)**2).sort_values()

Row 0
d   0.0014305647330767452
c   0.001652892561983471
f   0.004826081849717869
e   0.004898248984820989
b   0.029338383204991835
a   0.045949447043769395

现在我们获得了想要的排名:首先是 d,然后是 c、f、e、b 和 a


推荐阅读