次のような、並べ替えられた列を持つデータフレームがあります。
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)
サンプル実行-
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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加