pandas: create single size & sum columns after group by multiple columns
我有一个数据框架,我在其中对3列进行GroupBy,并对数值列的总和和大小进行聚合。运行代码后
1 | df = pd.DataFrame.groupby(['year','cntry', 'state']).agg(['size','sum']) |
我得到如下信息:
现在,我想从主列中拆分大小子列,只创建单个大小的列,但要将总和列保留在主列标题下。我尝试过不同的方法,但没有成功。以下是我尝试过但无法让事情对我起作用的方法:
如何按对象统计熊猫组中的行数?
将pandas groupby对象转换为数据帧
如果有人能帮助我,我将不胜感激。
当做,
安装程序
1 2 3 4 5 6 7 8 9 10 11 | d1 = pd.DataFrame(dict( year=np.random.choice((2014, 2015, 2016), 100), cntry=['United States' for _ in range(100)], State=np.random.choice(states, 100), Col1=np.random.randint(0, 20, 100), Col2=np.random.randint(0, 20, 100), Col3=np.random.randint(0, 20, 100), )) df = d1.groupby(['year', 'cntry', 'State']).agg(['size', 'sum']) df |
回答最简单的方法是只在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | d1.groupby(['year', 'cntry', 'State']).size() year cntry State 2014 United States California 10 Florida 9 Massachusetts 8 Minnesota 5 2015 United States California 9 Florida 7 Massachusetts 4 Minnesota 11 2016 United States California 8 Florida 8 Massachusetts 11 Minnesota 10 dtype: int64 |
使用计算的
1 | df.xs('size', axis=1, level=1) |
如果每个列的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | df[('Col1', 'size')] year cntry State 2014 United States California 10 Florida 9 Massachusetts 8 Minnesota 5 2015 United States California 9 Florida 7 Massachusetts 4 Minnesota 11 2016 United States California 8 Florida 8 Massachusetts 11 Minnesota 10 Name: (Col1, size), dtype: int64 |
组合视图1
1 2 | pd.concat([df[('Col1', 'size')].rename('size'), df.xs('sum', axis=1, level=1)], axis=1) |
组合视图2
1 2 | pd.concat([df[('Col1', 'size')].rename(('', 'size')), df.xs('sum', axis=1, level=1, drop_level=False)], axis=1) |
PirSquared击败了我,但如果你必须这样做,并想保持与下面的列和和或大小对齐,你可以重新索引列以删除大小值,然后添加一个新列以包含大小值。
例如:
1 2 3 4 5 6 7 | group = df.groupby(['year', 'cntry','state']).agg(['sum','size']) mi = pd.MultiIndex.from_product([['Col1','Col2','Col3'],['sum']]) group = group.reindex_axis(mi,axis=1) sizes = df.groupby('state').size().values group['Tot'] = 0 group.columns = group.columns.set_levels(['sum','size'], level=1) group.Tot.size = sizes |
结果会是这样:
1 2 3 4 5 6 7 | Col1 Col2 Col3 Tot sum sum sum size year cntry State 2015 US CA 20 0 4 1 FL 40 3 5 1 MASS 8 1 3 1 MN 12 2 3 1 |