44

パンダのデータフレームを使用するとします...

    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. 空のデータフレームに出力を追加します
4

4 に答える 4

39

大まかに相当するのは ですが.reset_index()、 の「反対」と考えるのは役に立たないかもしれませんgroupby()

文字列を断片に分割し、各断片と「家族」との関連付けを維持しています。私のこの古い答えは仕事をします。

最初に「家族」をインデックス列として設定し、上記のリンクを参照してからreset_index()、最後に目的の結果を取得してください。

于 2013-11-21T13:58:25.733 に答える
-1

DataFrame.groupby を元に戻す方法はいくつかあります。1 つの方法は、DataFrame.groupby.filter(lambda x:True) を実行することです。これにより、元の DataFrame に戻ります。

于 2019-09-12T06:13:53.940 に答える