我有一个简单的数据帧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这是可行的,但是有没有更直接的方法呢?
发布于 2016-05-12 22:27:02
使用transform将列从groupby聚合添加回原始df,transform将返回索引与原始df对齐的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发布于 2016-05-12 22:29:41
另一种使用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发布于 2022-01-22 16:56:35
您可以计算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 4https://stackoverflow.com/questions/37189878
复制相似问题