86

groupby特定の列の最小値を持たないすべての行を削除するために、パンダのデータフレームで使用しています。このようなもの:

df1 = df.groupby("item", as_index=False)["diff"].min()

ただし、これらの 2 つ以上の列がある場合、他の列 (たとえばotherstuff、私の例) は削除されます。を使用してこれらの列を保持できますかgroupby、それとも行を削除する別の方法を見つける必要がありますか?

私のデータは次のようになります。

    item    diff   otherstuff
   0   1       2            1
   1   1       1            2
   2   1       3            7
   3   2      -1            0
   4   2       1            3
   5   2       4            9
   6   2      -6            2
   7   3       0            0
   8   3       2            9

最終的には次のようになります。

    item   diff  otherstuff
   0   1      1           2
   1   2     -6           2
   2   3      0           0

しかし、私が得ているのは:

    item   diff
   0   1      1           
   1   2     -6           
   2   3      0                 

私はドキュメントを調べてきましたが、何も見つかりません。私は試した:

df1 = df.groupby(["item", "otherstuff"], as_index=false)["diff"].min()

df1 = df.groupby("item", as_index=false)["diff"].min()["otherstuff"]

df1 = df.groupby("item", as_index=false)["otherstuff", "diff"].min()

しかし、それらのどれも機能しません (最後のもので、構文はグループが作成された後に集約するためのものであることに気付きました)。

4

5 に答える 5

151

方法 #1: を使用して maximumの要素のインデックスidxmin()を取得し、それらを選択します。diff

>>> df.loc[df.groupby("item")["diff"].idxmin()]
   item  diff  otherstuff
1     1     1           2
6     2    -6           2
7     3     0           0

[3 rows x 3 columns]

方法 #2: で並べ替え、各グループdiffの最初の要素を取得します。item

>>> df.sort_values("diff").groupby("item", as_index=False).first()
   item  diff  otherstuff
0     1     1           2
1     2    -6           2
2     3     0           0

[3 rows x 3 columns]

行の内容が同じであっても、結果のインデックスは異なることに注意してください。

于 2014-04-30T17:43:00.297 に答える
1

上記の答えは、1分が必要な場合にうまく機能しました。私の場合、複数の分が存在する可能性があり、すべての行を最小に等しくしたかったのですが、これ.idxmin()は得られません。これはうまくいきました

def filter_group(dfg, col):
    return dfg[dfg[col] == dfg[col].min()]

df = pd.DataFrame({'g': ['a'] * 6 + ['b'] * 6, 'v1': (list(range(3)) + list(range(3))) * 2, 'v2': range(12)})
df.groupby('g',group_keys=False).apply(lambda x: filter_group(x,'v1'))

余談ですが、.filter()もこの質問に関連していますが、私にとってはうまくいきませんでした。

于 2018-03-25T13:04:15.417 に答える
-1

すべての「アイテム」にソート可能なレコードが複数あることがわかっている場合は、次を使用しますduplicated

df.sort_values(by='diff').duplicated(subset='item', keep='first')
于 2018-09-17T22:01:59.707 に答える