2016-05-12 10 views
3

をGROUPBYに列を追加します。パンダは、私はこの単純なデータフレーム<code>df</code>持つデータフレーム

df = pd.DataFrame({'c':[1,1,1,2,2,2,2],'type':['m','n','o','m','m','n','n']}) 

を私の目標は、各cためtypeの値をカウントし、その後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列を追加することができますか?動作しますが、これを行うために、より簡単な方法がある

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 

:これまでのところ私はmapを使用しましたか?

答えて

4

使用transform ORIGのDFに合わせ、そのインデックスにSeriesを返しtransformgroupby集合からバックORIGのDFに列を追加する:transformlen

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 
+0

私はもっと簡単なことがあると知っていました...ありがとう! –

+0

実際、この場合、 'value_counts()'を保持したいので、 'g ['size'] = g.groupby( 'c')['t']。 。 –

+1

これは、https://stackoverflow.com/questions/30244952/python-pandas-create-new-column-with-groupby-sumよりもはるかに良い答えです。 – vagabond

1

別の解決策:

df['size'] = df.groupby('c')['type'].transform(len) 
print df 
    c type size 
0 1 m 3 
1 1 n 3 
2 1 o 3 
3 2 m 4 
4 2 m 4 
5 2 n 4 
6 2 n 4 
関連する問題