Python 熊猫:创建单一尺寸&;按多列分组后对列求和
我有一个数据框架,在其中我对3列进行分组,并聚合数字列的总和和大小。在运行代码之后Python 熊猫:创建单一尺寸&;按多列分组后对列求和,python,pandas,Python,Pandas,我有一个数据框架,在其中我对3列进行分组,并聚合数字列的总和和大小。在运行代码之后 df = pd.DataFrame.groupby(['year','cntry', 'state']).agg(['size','sum']) 我得到的信息如下: 现在,我想将我的大小子列与主列分开,只创建一个大小的列,但希望将总和列保留在主列标题下。我尝试过不同的方法,但没有成功。 以下是我尝试过但无法让事情对我起作用的方法: 如果有人能帮我做这件事,我将不胜感激 关于设置 d1 = pd.DataF
df = pd.DataFrame.groupby(['year','cntry', 'state']).agg(['size','sum'])
我得到的信息如下:
现在,我想将我的大小子列与主列分开,只创建一个大小的列,但希望将总和列保留在主列标题下。我尝试过不同的方法,但没有成功。
以下是我尝试过但无法让事情对我起作用的方法:
如果有人能帮我做这件事,我将不胜感激
关于设置
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
pd.concat([df[('Col1', 'size')].rename(('', 'size')),
df.xs('sum', axis=1, level=1, drop_level=False)], axis=1)
回答
最简单的方法是只在
groupby
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
要使用计算的
df
df.xs('size', axis=1, level=1)
如果每个列的大小不同,这将非常有用。但是,由于大小
列对于['Col1','Col2','Col3']
是相同的,所以我们可以这样做
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
组合视图2
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
pd.concat([df[('Col1', 'size')].rename(('', 'size')),
df.xs('sum', axis=1, level=1, drop_level=False)], axis=1)
piRSquared比我快,但如果您必须这样做,并且希望保持与列和下方的总和或大小对齐,则可以重新索引列以删除大小值,然后添加一个新列以包含大小值
例如:
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
结果会是这样的:
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
嗨,piRSquared,谢谢你的详细回复,但是我对上面的代码有两个问题。第一:当我运行代码df.xs('size',axis=1,level=1)时,我得到了以下错误:ValueError:没有为对象类型命名为1的轴;第二,我需要将sum列也保留在col1、col2和col3下。你能告诉我怎么解决这个问题吗?Regards@Baig您得到的第一个值错误来自df
不是数据帧,而是一个序列。请检查您的变量。如果上面定义了d1
,并且df=d1.groupby(['year','cntry','State']).agg(['size','sum'])
,则不可能出现此错误。第二个问题,我将通过更新帖子来解决。