这两种方法的效果并不完全一样,具体来说:
1. agg() 方法
agg_df = df.groupby(level_ + ["标记", "channelCode"]).agg({"count": "sum", "total": "sum"}).reset_index()
效果
agg()方法是在level_ + ["标记", "channelCode"]组合的分组下,计算count和total列的总和。reset_index()会将分组的索引重置为普通列,返回一个新的DataFrame,包含分组后的汇总数据。- 生成的
agg_df是每个分组的汇总结果,每个分组在agg_df中只出现一次。
示例输出
| level_ | 标记 | channelCode | count_sum | total_sum |
|--------|------|-------------|-----------|-----------|
| A | 0 | 1 | 100 | 200 |
| B | 1 | 2 | 150 | 300 |
2. transform() 方法
agg_df = df.groupby(level_ + ["标记", "channelCode"])[["count", "total"]].transform('sum')
效果
transform('sum')计算每个分组的count和total列的总和,但将结果扩展回原始的DataFrame大小,每行包含了所在分组的汇总值。- 生成的
agg_df与df大小相同,而不是每个分组只出现一次。 - 该方法适用于在每行上保持原有分组汇总数据,例如计算每行在分组总和中的占比。
示例输出
假设原始 df 的部分内容如下:
| level_ | 标记 | channelCode | count | total |
|--------|------|-------------|-------|-------|
| A | 0 | 1 | 20 | 40 |
| A | 0 | 1 | 30 | 60 |
| A | 0 | 1 | 50 | 100 |
| B | 1 | 2 | 50 | 80 |
| B | 1 | 2 | 100 | 220 |
经过 transform('sum') 后:
| level_ | 标记 | channelCode | count | total | count_sum | total_sum |
|--------|------|-------------|-------|-------|-----------|-----------|
| A | 0 | 1 | 20 | 40 | 100 | 200 |
| A | 0 | 1 | 30 | 60 | 100 | 200 |
| A | 0 | 1 | 50 | 100 | 100 | 200 |
| B | 1 | 2 | 50 | 80 | 150 | 300 |
| B | 1 | 2 | 100 | 220 | 150 | 300 |
总结
agg()生成一个新的、分组汇总的DataFrame。transform()将分组结果扩展回原DataFrame,保留每行的汇总值,适合进一步计算比例等操作。
这两者可以互补使用,具体选择取决于分析需求。