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
列の値は単なる例です。この特定の例では、平均化後に失われる情報は気にしません)
私がそれを行うことができると思った方法はあまり効率的に見えません:
group_df
_のすべての行から、名前を区切りますおおまかに相当するものは.reset_index()
ですが、これをgroupby()
。
文字列を断片に分割し、各断片の「家族」との関連付けを維持しています。 私の私の古い答え は仕事をします。
最初に「family」をインデックス列として設定し、上記のリンクを参照し、最後にreset_index()
を参照して、目的の結果を取得します。
DataFrame.groupbyを元に戻すにはいくつかの方法があります。1つの方法はDataFrame.groupby.filter(lambda x:True)を実行することで、元のDataFrameに戻ります。
これは、グループ化されたオブジェクトから元のデータフレームを復元する完全な例です
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