以下の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はタプルの最初の値として返されますが、それを集計すると失われます。私が探しているデータフレームを取得する方法はありますか?つまり、グループ化された列を失うことなく、グループ化して集計します。
Groupbyをインデックスにしたくない場合は、それ以上のリセットを回避するための引数があります。
df.groupby('Id', as_index=False).agg(lambda x: set(x))
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}