1. ホーム
  2. python

[解決済み] groupby時に他のカラムを保持する

2023-05-28 06:19:50

質問

私は 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()

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

どのように解決するのですか?

方法その1: 使用する 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]

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