カーディナリティが最小限のパンダデータフレーム選択グループ

2014年05月18日に質問されました。  ·  閲覧回数 2.6k回  ·  ソース

Run2 picture
2014年05月18日

グループ内のアイテムの数が特定の数(カットオフ)を超えるデータフレームから行のグループを取得する必要があるという問題があります。 それらのグループのために、私はいくつかの頭の列と尾の列を取る必要があります。

私は以下のコードを使用しています

train = train[train.groupby('id').id.transform(len) > headRows]
groups = pd.concat([train.groupby('id').head(headRows),train.groupby('id').tail(1)]).sort_index()

これは機能します。 しかし、最初の行は非常に遅いです:(。30分以上。

最初の行を速くする方法はありますか? 最初の行を使用しないと、2番目の行の結果からインデックスが重複し、混乱します。

よろしくお願いします

注:私の列車のデータフレームには、約700,000行にわたってさまざまなグループサイズの約70,000のグループがあります。 これは、Python Pandas Dataframeで列を動的に追加する基づいています。 ジェフはそこで素晴らしい答えを出しましたが、グループサイズがジェフの答えのように行を連結するときにhead(parameter)で渡すパラメーター以下の場合は失敗します:[31]:groups = concat....。

回答

Karl D. picture
2014年05月18日
5

groupby/filter使用します:

>>> df.groupby('id').filter(lambda x: len(x) > cutoff)

これにより、グループのサイズがカットオフよりも大きいデータフレームの行が返されます。 また、パフォーマンスもかなり向上するはずです。 ここでは、30,039個の「id」グループと400万を少し超える観測値を持つデータフレームを使用して、 filter時間を計測しました。

In [9]: %timeit df.groupby('id').filter(lambda x: len(x) > 12)
1 loops, best of 3: 12.6 s per loop