python - 使用排序列更有效地获取数据框中最小元素的整体分布
问题描述
我有一个带有排序列的数据框,如下所示:
df = pd.DataFrame({q: np.sort(np.random.randn(10).round(2)) for q in ['blue', 'green', 'red']})
blue green red
0 -2.15 -0.76 -2.62
1 -0.88 -0.62 -1.65
2 -0.77 -0.55 -1.51
3 -0.73 -0.17 -1.14
4 -0.06 -0.16 -0.75
5 -0.03 0.05 -0.08
6 0.06 0.38 0.37
7 0.41 0.76 1.04
8 0.56 0.89 1.16
9 0.97 2.94 1.79
我想知道的是整个框架中n个最小元素中有多少在每一列中。这是我唯一想到的:
is_small = df.isin(np.partition(df.values.flatten(), n)[:n])
当 n=10 时,它看起来像这样:
blue green red
0 True True True
1 True False True
2 True False True
3 True False True
4 False False True
5 False False False
6 False False False
7 False False False
8 False False False
9 False False False
然后通过应用 np.sum 我得到与每一列对应的数字。
我对这个解决方案不满意,因为它绝不会利用原始数据的排序性。所有数据都被分区,然后检查所有数据是否在分区中。这似乎很浪费,我似乎找不到更好的方法。
解决方案
可以说,您正在查看 10 个最小的,您可以堆叠并找到 10 个最小的 value_count
df.stack().nsmallest(10).index.get_level_values(1).value_counts()
你得到
red 5
blue 4
green 1
推荐阅读
- html - Css动画过渡变换不起作用
- java - 如何在最短的执行时间内解决以下问题(Java)
- google-apps-script - 如何从另一个 GAS 项目访问脚本属性
- flutter - Flutter - 使容器的大小适应其中的内容
- mysql - 使用 VB.NET 应用程序手动创建 MySQL 触发器(系统税错误)
- loopback4 - 在 loopback4 中调用存储过程
- python - 如何在python中的数组中附加一个空格分隔的整数输入数组?
- python - 无法使用python将webelement转换为整数
- javascript - 如何使用 lodash orderBy 对具有深层嵌套属性的对象数组进行排序?
- python - 如何在 kivy uix 相机中获得最大相机分辨率?