我的假设数据框是
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
我在这里缺少什么?
答案 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