Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将列添加到groupby数据帧_Python_Pandas - Fatal编程技术网

Python 将列添加到groupby数据帧

Python 将列添加到groupby数据帧,python,pandas,Python,Pandas,我有一个简单的数据帧df: 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

我有一个简单的数据帧
df

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
列直接添加到第一个数据帧?到目前为止,我使用
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
哪种方法有效,但有更直接的方法吗?

用于将列从
groupby
聚合添加回原始df,
transform
返回索引与原始df对齐的
系列

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
另一个带有
len
的解决方案:

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
另一个解决方案包括和:


实际上,在这种情况下,我们应该将其更改为
g['size']=g.groupby('c')['t']].transform('size')
,因为我想保留
值\u counts()
。这是一个比以下更好的答案:到transform的链接稍微改变了一点,这是一个新的问题:你能简单地解释一下为什么你删除了原始答案的第一部分吗?(我发现它对我的目标很有用,这与OP不同,但问题的标题很好地描述了它(这就是我如何做到的))
df['size'] = df['c'].map(df['c'].value_counts())
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