web-dev-qa-db-ja.com

パンダの.groupbyとは逆の「グループ解除」操作はありますか?

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

おおまかに相当するものは.reset_index()ですが、これをgroupby()

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

最初に「family」をインデックス列として設定し、上記のリンクを参照し、最後にreset_index()を参照して、目的の結果を取得します。

21
Dan Allan

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

0
xuancong84

これは、グループ化されたオブジェクトから元のデータフレームを復元する完全な例です

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

print('create dataframe\n')
df = pandas.DataFrame({'name':['john', 'jason', 'jane', 'jack', 'james'], 'age':[1,36,32,26,30], 'family':[1,1,1,2,2]})
df.index.name='indexer'
print(df)
print('create group_by object')
group_obj_df = df.groupby('family')
print(group_obj_df)

print('\nrecover grouped df')
group_joined_df = group_obj_df.aggregate({'name': name_join, 'age': 'mean'})
group_joined_df


create dataframe

          name  age  family
indexer                    
0         john    1       1
1        jason   36       1
2         jane   32       1
3         jack   26       2
4        james   30       2
create group_by object
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7fbfdd9dd048>

recover grouped df 
                   name  age
family                      
1       john-jason-jane   23
2            jack-james   28
print('\nRecover the original dataframe')
print(pandas.concat([group_obj_df.get_group(key) for key in group_obj_df.groups]))

Recover the original dataframe
          name  age  family
indexer                    
0         john    1       1
1        jason   36       1
2         jane   32       1
3         jack   26       2
4        james   30       2
0
Skysail