パンダのデータフレームに各グループの上位n行を保持し、ソリューションではパーセンテージではなく絶対数としてnを使用するというこの質問の変形を確認しました。ここでは、パンダは各グループ内で最上位のnレコードを取得します。ただし、私のデータフレームでは、各グループの行数が異なるため、各グループの上位n%の行を保持したいと思います。この問題にどのようにアプローチしますか?
ブール型の一連のフラグを作成し、前にフィルタリングすることができますgroupby
。まず、サンプルデータフレームを作成し、最初のシリーズの一意の値ごとに行数を確認しましょう。
np.random.seed(0)
df = pd.DataFrame(np.random.randint(0, 2, (10, 3)))
print(df[0].value_counts())
0 6
1 4
Name: 0, dtype: int64
次に、分数を定義します。たとえば、50%以下で、フィルタリング用のブール系列を作成します。
n = 0.5
g = df.groupby(0)
flags = (g.cumcount() + 1) <= g[1].transform('size') * n
次に、条件を適用し、インデックスを最初の系列として設定し、(必要に応じて)インデックスを並べ替えます。
df = df.loc[flags].set_index(0).sort_index()
print(df)
1 2
0
0 1 1
0 1 1
0 1 0
1 1 1
1 1 0
ご覧のとおり、結果のデータフレームには3つの0
インデックスと2つのインデックスしかなく1
、いずれの場合も元のデータフレームの半分の数です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加