如何将组添加到groupby

时间:2017-08-31 10:51:02

标签: python pandas group-by pandas-groupby

我的假设数据框是

const fakePropType: any = () => null
fakeProptype.isRequired = () => null

对两列进行分组会生成这些组:

df = pd.DataFrame({'col1':[91,91,91,91,92,92,92,92],
                  'col2':[91,92]*4,'value':[10]*8})
df

   col1 col2 value
0   91  91  10
1   91  92  10
2   91  91  10
3   91  92  10
4   92  91  10
5   92  92  10
6   92  91  10
7   92  92  10

我想扩展这组组,以便我可以聚合扩展的组选择 假设我想添加由

生成的组
grouped = df.groupby(['col1','col2'])
grouped.groups
{(91, 91): Int64Index([0, 2], dtype='int64'),
 (91, 92): Int64Index([1, 3], dtype='int64'),
 (92, 91): Int64Index([4, 6], dtype='int64'),
 (92, 92): Int64Index([5, 7], dtype='int64')}

这是我尝试的:我用99代替col2值(其中99代表'any'),

groupedall = df.groupby(['col1'])
groupedall.groups
{91: Int64Index([0, 1, 2, 3], dtype='int64'),
 92: Int64Index([4, 5, 6, 7], dtype='int64')}

然后将这些新组添加到我原来的组dict中。

groupedall.groups[(91, 99)] = groupedall.groups.pop(91)
groupedall.groups[(92, 99)] = groupedall.groups.pop(92)

但是当我尝试对分组对象进行分组时,省略了那些新添加的组。

grouped.groups.update(groupedall.groups)
grouped.groups
{(91, 91): Int64Index([0, 2], dtype='int64'),
 (91, 92): Int64Index([1, 3], dtype='int64'),
 (91, 99): Int64Index([0, 1, 2, 3], dtype='int64'),
 (92, 91): Int64Index([4, 6], dtype='int64'),
 (92, 92): Int64Index([5, 7], dtype='int64'),
 (92, 99): Int64Index([4, 5, 6, 7], dtype='int64')}

我希望输出包含我刚刚添加的组:

grouped.sum()
               value
col1    col2    
91      91      20
        92      20
92      91      20
        92      20

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

选项1

df.append(df.assign(col2=99)).groupby(['col1', 'col2']).sum()

           value
col1 col2       
91   91       20
     92       20
     99       40
92   91       20
     92       20
     99       40

选项2

dummy_series = pd.Series(99, df.index, name='col2')

pd.concat([
    df.groupby(['col1', 'col2']).sum(),
    df.groupby(['col1', dummy_series])[['value']].sum()
]).sort_index()

           value
col1 col2       
91   91       20
     92       20
     99       40
92   91       20
     92       20
     99       40

答案 1 :(得分:0)

这里的关键似乎是您要手动将组添加到GroupByDataFrame。

当您查看grouped.groups时,这似乎有效,但当您查看grouped的任何其他属性时,很明显新组不被视为一个组。

似乎无法以这种方式更改groupbydataframe,但使用@ QuickBeam2k1提供的链接,您可以通过执行以下操作获取所需的数据:

df.pivot_table(
    index='col1',
    columns='col2',
    values='value',
    aggfunc='sum',
    margins=True
)

返回:

col2    91      92      All
col1            
91      20.0    20.0    40.0
92      20.0    20.0    40.0
All     40.0    40.0    80.0