web-dev-qa-db-ja.com

パンダ:グループ化された列を失うことなくグループ化および集約

以下のpandas dataframeがあります。各IDに複数の名前とサブIDを含めることができます。

Id      NAME   SUB_ID
276956  A      5933
276956  B      5934
276956  C      5935
287266  D      1589

各IDに1つの行のみがあり、各IDの下のすべての名前とsub_idがその行の単一セットとして表示されるようにデータフレームを圧縮したい

Id      NAME           SUB_ID
276956  set(A,B,C)     set(5933,5934,5935)
287266  set(D)         set(1589) 

Idをgroupbyしてから、他のすべての列を集計しようとしました

df.groupby('Id').agg(lambda x: set(x))

ただし、その場合、結果のデータフレームにはId列がありません。 groupbyを実行すると、IDはタプルの最初の値として返されますが、それを集計すると失われます。私が探しているデータフレームを取得する方法はありますか?つまり、グループ化された列を失うことなく、グループ化して集計します。

16
Fizi

Groupbyをインデックスにしたくない場合は、それ以上のリセットを回避するための引数があります。

df.groupby('Id', as_index=False).agg(lambda x: set(x))
21
Boud

Groupby列がインデックスになります。単にインデックスをリセットしてそれを取り戻すことができます:

In [4]: df.groupby('Id').agg(lambda x: set(x)).reset_index()
Out[4]: 
       Id       NAME              SUB_ID
0  276956  {A, C, B}  {5933, 5934, 5935}
1  287266        {D}              {1589}
12
chrisaycock