熊猫向groupby数据框添加列
- 2025-02-08 08:52:00
- admin 原创
- 49
问题描述:
我有这个简单的数据框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
,transform
返回Series
其索引与原始 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
解决方案 2:
另一个解决方案是:transform
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
另一个解决方案是使用Series.map
和Series.value_counts
:
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
解决方案 3:
您可以计算 groupby 对象并多次使用它:
g = df.groupby('c')['type']
df = g.value_counts().reset_index(name='counts')
df['size'] = g.transform('size')
或者
g.value_counts().reset_index(name='counts').assign(size=g.transform('size'))
输出:
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
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD