agg() 方法与transform()方法效果比较

96 阅读2分钟

这两种方法的效果并不完全一样,具体来说:

1. agg() 方法

agg_df = df.groupby(level_ + ["标记", "channelCode"]).agg({"count": "sum", "total": "sum"}).reset_index()

效果

  • agg() 方法是在 level_ + ["标记", "channelCode"] 组合的分组下,计算 counttotal 列的总和。
  • 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') 计算每个分组的 counttotal 列的总和,但将结果扩展回原始的 DataFrame 大小,每行包含了所在分组的汇总值。
  • 生成的 agg_dfdf 大小相同,而不是每个分组只出现一次。
  • 该方法适用于在每行上保持原有分组汇总数据,例如计算每行在分组总和中的占比。

示例输出

假设原始 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,保留每行的汇总值,适合进一步计算比例等操作。

这两者可以互补使用,具体选择取决于分析需求。