1. ホーム
  2. python

[解決済み] pandasの.groupbyと反対の「ungroup by」操作はありますか?

2022-02-02 22:15:57

質問

pandasのdataframeを取り出したとすると...。

    name  age  family
0   john    1       1
1  jason   36       1
2   jane   32       1
3   jack   26       2
4  james   30       2

次に groupby() ...

group_df = df.groupby('family')
group_df = group_df.aggregate({'name': name_join, 'age': pd.np.mean})

次に、何らかの集約/集計処理を行います(この例では、私の関数 name_join は名前を集約する)。

def name_join(list_names, concat='-'):
    return concat.join(list_names)

グループ化された要約出力はこのようになります。

        age             name
family                      
1        23  john-jason-jane
2        28       jack-james

質問です。

集計されたテーブルから以下のように素早く、効率的に取得する方法はありますか?

    name  age  family
0   john   23       1
1  jason   23       1
2   jane   23       1
3   jack   28       2
4  james   28       2

(注) age 列の値は単なる例であり、この特定の例では平均化した後に失う情報は気にしない)

私が考えた方法は、あまり効率的ではなさそうです。

  1. 空のデータフレームを作成する
  2. の各行から group_df のように、名前を区切ります。
  3. 開始行の名前と同じ数の行を持つデータフレームを返します。
  4. 空のデータフレームに出力を追加します。

解決方法は?

大雑把に言うと .reset_index() の反対と考えるのは、あまり有益ではないかもしれません。 groupby() .

文字列をバラバラに分割し、それぞれの断片と「家族」の関連付けを維持しているのです。 私のこの古い答え がその役割を担っています。

ただ、最初にインデックスカラムとして'family'を設定し、上記のリンクを参照して reset_index() を最後に追加すれば、希望する結果が得られます。