首页 > 解决方案 > 使用排序列更有效地获取数据框中最小元素的整体分布

问题描述

我有一个带有排序列的数据框,如下所示:

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 我得到与每一列对应的数字。

我对这个解决方案不满意,因为它绝不会利用原始数据的排序性。所有数据都被分区,然后检查所有数据是否在分区中。这似乎很浪费,我似乎找不到更好的方法。

标签: pythonpython-3.xpandasnumpy

解决方案


可以说,您正在查看 10 个最小的,您可以堆叠并找到 10 个最小的 value_count

df.stack().nsmallest(10).index.get_level_values(1).value_counts()

你得到

red      5
blue     4
green    1

推荐阅读