首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pandas向groupby数据框添加列

pandas向groupby数据框添加列
EN

Stack Overflow用户
提问于 2016-05-12 22:25:26
回答 3查看 51.1K关注 0票数 31

我有一个简单的数据帧df

代码语言:javascript
复制
df = pd.DataFrame({'c':[1,1,1,2,2,2,2],'type':['m','n','o','m','m','n','n']})

我的目标是计算每个ctype值,然后添加一个大小为c的列。因此,从以下内容开始:

代码语言:javascript
复制
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

第一个问题解决了。然后我还可以:

代码语言:javascript
复制
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作为:

代码语言:javascript
复制
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

这是可行的,但是有没有更直接的方法呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-12 22:27:02

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

代码语言:javascript
复制
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
票数 30
EN

Stack Overflow用户

发布于 2016-05-12 22:29:41

另一种使用transform len的解决方案

代码语言:javascript
复制
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

另一种使用Series.mapSeries.value_counts的解决方案

代码语言:javascript
复制
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
票数 13
EN

Stack Overflow用户

发布于 2022-01-22 16:56:35

您可以计算groupby对象并多次使用它:

代码语言:javascript
复制
g = df.groupby('c')['type']

df = g.value_counts().reset_index(name='counts')
df['size'] = g.transform('size')

代码语言:javascript
复制
g.value_counts().reset_index(name='counts').assign(size=g.transform('size'))

输出:

代码语言:javascript
复制
   c type  counts  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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37189878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档