У меня есть датафрейм с отсортированными столбцами, что-то вроде этого:
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, я получаю число, соответствующее каждому столбцу.
Я недоволен этим решением, потому что оно никоим образом не использует сортировку исходных данных. Все данные разделяются на части, а все данные затем проверяются на наличие в разделе. Это кажется расточительным, и я не могу придумать лучшего способа.