设置
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
回答
最简单的方法本来只运行size
后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)
而且如果size
是不同的,这将是有益的每列。但由于size
列是['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
pd.concat([df[('Col1', 'size')].rename('size'),
df.xs('sum', axis=1, level=1)], axis=1)
组合视图2
pd.concat([df[('Col1', 'size')].rename(('', 'size')),
df.xs('sum', axis=1, level=1, drop_level=False)], axis=1)
嗨piRSquared, 感谢您的详细答复,但我有两个关注与上面的代码。 首先:当我运行代码 df.xs('size',axis = 1,level = 1) 我收到以下错误: ValueError:对象类型 其次,我需要保留col1,col2和col3以下的总和列。 你能告诉我如何解决这个问题吗? Registers –
Baig
@Baig你得到的第一个值错误是从'df'不是一个数据框,而是一个系列。请检查你的变量。如果'd1'的定义如上,并且'df = d1.groupby(['year','cntry','State'])。agg(['size','sum'])',那么这个错误是不可能的。第二个问题,我会通过更新帖子来解决。 – piRSquared