python - 使用排序列更有效地获取数据框中最小元素的整体分布

标签 python python-3.x pandas numpy

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

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

我对这个解决方案不满意,因为它根本没有利用原始数据的排序。 所有 数据被分区,然后检查所有 数据是否在分区中。这看起来很浪费,我似乎想不出更好的方法。

最佳答案

认为您可以将 n 个最小值中的最大值与分区值进行比较,然后使用 idxmin 来利用排序的性质 -

# Find largest of n smallest numbers
N = (np.partition(df.values.flatten(), n)[:n]).max()
out = (df<=N).idxmin(axis=0)

sample 运行-

In [152]: np.random.seed(0)

In [153]: df = pd.DataFrame({q: np.sort(np.random.randn(10).round(2)) \
          for q in ['blue', 'green', 'red']})

In [154]: df
Out[154]: 
   blue  green   red
0 -0.98  -0.85 -2.55
1 -0.15  -0.21 -1.45
2 -0.10   0.12 -0.74
3  0.40   0.14 -0.19
4  0.41   0.31  0.05
5  0.95   0.33  0.65
6  0.98   0.44  0.86
7  1.76   0.76  1.47
8  1.87   1.45  1.53
9  2.24   1.49  2.27

In [198]: n = 5

In [199]: N = (np.partition(df.values.flatten(), n)[:n]).max()

In [200]: (df<=N).idxmin(axis=0)
Out[200]: 
blue     1
green    1
red      3
dtype: int64

关于python - 使用排序列更有效地获取数据框中最小元素的整体分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53326507/

相关文章:

python - 如何使用 NVIDIA "cuda toolkit"版本而不是官方 conda "cudatoolkit"版本运行 pytorch?

Python Pandas groupby : how to do conditional aggregation dependent on other column

python - 两个整数具有相同的哈希值

python - 如何将我的数据导入到 python 中

python - 在 matplotlib 中绘制 Pandas 日期

python - 在 Python 中将非常大的文件拆分成较小的文件 - 打开的文件太多

python - python def 是否可能同时包含 "yield"和 "return"?

python - 正则表达式查找所有不包含_(下划线)和:(Colon) in PySpark Dataframe column的字符串

python - 用 bool 数组掩盖系列

pandas - 哪些 pandas 方法具有 engine_kwargs 来支持 numba?