2016-09-30 103 views
3

我有一个数据框,我在3列上做groupby并聚合数字列的总和和大小。运行代码熊猫:创建单个大小和总计列之后多列

df = pd.DataFrame.groupby(['year','cntry', 'state']).agg(['size','sum']) 

后,我得到的东西象下面这样:

Image of datafram

现在我想从主要栏目分裂我的尺寸分列,并创建只有单一尺寸列,但要保留在主列标题下列出总和列。我尝试过不同的方法,但不成功。 这些是我的工作,我已经试过的方法,但无法得到的东西:

How to count number of rows in a group in pandas group by object?

Converting a Pandas GroupBy object to DataFrame

会感激,如果有人能帮助我这一个。

问候,

回答

4

设置

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 

enter image description here


回答
最简单的方法本来只运行sizegroupby

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) 

enter image description here

而且如果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) 

enter image description here


组合视图2

pd.concat([df[('Col1', 'size')].rename(('', 'size')), 
      df.xs('sum', axis=1, level=1, drop_level=False)], axis=1) 

enter image description here

+0

嗨piRSquared, 感谢您的详细答复,但我有两个关注与上面的代码。 首先:当我运行代码 df.xs('size',axis = 1,level = 1) 我收到以下错误: ValueError:对象类型 其次,我需要保留col1,col2和col3以下的总和列。 你能告诉我如何解决这个问题吗? Registers – Baig

+0

@Baig你得到的第一个值错误是从'df'不是一个数据框,而是一个系列。请检查你的变量。如果'd1'的定义如上,并且'df = d1.groupby(['year','cntry','State'])。agg(['size','sum'])',那么这个错误是不可能的。第二个问题,我会通过更新帖子来解决。 – piRSquared

2

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