次のような単純なデータフレームがありますdf
:
df = pd.DataFrame({'c':[1,1,1,2,2,2,2],'type':['m','n','o','m','m','n','n']})
type
私の目標は、各の値をカウントしc
、サイズ の列を追加することですc
。まず、次の操作から始めます。
In [27]: g = df.groupby('c')['type'].value_counts().reset_index(name='t')
In [28]: g
Out[28]:
c type t
0 1 m 1
1 1 n 1
2 1 o 1
3 2 m 2
4 2 n 2
最初の問題は解決しました。次に、次のことも実行できます。
In [29]: a = df.groupby('c').size().reset_index(name='size')
In [30]: a
Out[30]:
c size
0 1 3
1 2 4
最初のデータフレームに列を直接追加するにはどうすればよいですかsize
? これまではmap
次のように使用していました:
In [31]: a.index = a['c']
In [32]: g['size'] = g['c'].map(a['size'])
In [33]: g
Out[33]:
c type t size
0 1 m 1 3
1 1 n 1 3
2 1 o 1 3
3 2 m 2 4
4 2 n 2 4
これは機能しますが、これを行うためのより簡単な方法はありますか?
ベストアンサー1
使用transform
集計から元の DF に列を追加するにはgroupby
、元の DF に揃えられたインデックスをtransform
持つ を返します。Series
In [123]:
g = df.groupby('c')['type'].value_counts().reset_index(name='t')
g['size'] = df.groupby('c')['type'].transform('size')
g
Out[123]:
c type t size
0 1 m 1 3
1 1 n 1 3
2 1 o 1 3
3 2 m 2 4
4 2 n 2 4