python - 如何确定数据框中的哪一行具有最均匀和最高的分布
问题描述
我想按分布最均匀但值也很高的行对熊猫数据框进行排序。例如:
行 属性 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 之后。
我考虑使用标准偏差来确定最均匀的分布,然后意味着获得最高的平均值,但我不确定如何将它们组合在一起。
解决方案
由于您提到的“均匀分布”的感知似乎很主观,这里有一个实现@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
推荐阅读
- sql-server-2012 - 在嵌入式 SQL 的打开游标中使用主机数组
- angular - VS Code 修复库的导入路径
- messagekit - 官方示例中消息左对齐和右对齐的条件在哪里?
- python - 用 python 和 Pandas 重塑多个变量
- python - 如何按回车键换行?
- visual-studio-code - 如何使用扩展定义并且不允许以与多个验证器兼容的方式附加属性(JSON 模式草案 7)?
- pandas - 在 Pandas 中分割一个系列
- c# - CS8804:如果存在具有顶级语句的编译单元,则无法指定 /main
- uml - 这个图可以代表一个迭代/集合中的每个吗?序列图还是活动图?
- c++ - Qt6 桌面应用程序和使用 cmake 的共享库