如何在Pandas中添加组级汇总统计作为一个新的列

  • Post category:Python

在Pandas中,可以通过groupby函数生成基于组级别的数据统计结果,例如组平均值、组求和等等。如果我们需要把这些统计结果添加到原始数据中作为一个新的列,可以使用transform函数实现。下面是详细的操作步骤和示例代码:

  1. 导入必要的库
import pandas as pd
  1. 生成示例数据

我们假设有一个销售订单数据,包括订单ID、客户ID、产品ID和销售额。我们可以通过以下代码生成一个示例数据:

df = pd.DataFrame({
    'order_id': ['A', 'A', 'B', 'B', 'B', 'C', 'C'],
    'customer_id': ['X', 'Y', 'X', 'Y', 'Z', 'X', 'Y'],
    'product_id': ['P1', 'P2', 'P1', 'P2', 'P1', 'P2', 'P2'],
    'sales': [100, 200, 150, 250, 300, 200, 150]
})

这个数据包括7个订单,每个订单有三个变量,分别是订单ID、客户ID和产品ID,以及一个销售额变量。

  1. 计算组级别的销售额统计结果

我们可以使用groupby函数按照不同的组(例如产品ID)对数据集进行分组,然后对每个组计算一些统计指标。例如下面的代码可以计算每个产品的销售总额、销售均价和销售件数:

grouped = df.groupby('product_id')
grouped_sales = grouped['sales'].agg(['sum', 'mean', 'count'])
grouped_sales = grouped_sales.add_prefix('product_')

这里我们使用了agg函数对销售额变量进行汇总统计,我们选择了一些常见的统计指标,包括总和(sum)、均值(mean)和计数(count)。由于agg函数的返回值是一个DataFrame,我们还使用了add_prefix函数给每个统计指标添加一个前缀,以方便后续的区分。

  1. 使用transform函数添加新列

我们可以使用transform函数把统计指标添加到原始数据集中,生成一个新的DataFrame。具体做法是,对每个组使用transform函数,返回一个Series,然后把这些Series合并为一个DataFrame。例如下面的代码可以把每个产品的销售总额、销售均价和销售件数添加到原始数据集中:

new_df = pd.concat([df, grouped.transform('sum'), grouped.transform('mean'), grouped.transform('count')],
                   axis=1)
new_df.columns = list(df.columns) + list(grouped_sales.columns)

这里我们把每个产品的统计指标对应的Series合并为一个DataFrame,并且把这个DataFrame和原始数据集合并在一起。这里我们使用了concat函数和axis参数,确保新生成的DataFrame和原始数据集在列方向上合并。

  1. 查看结果

现在我们可以查看新的DataFrame,可以看到每个订单的销售额、所属的产品、以及该产品的销售总额、销售均价和销售件数:

print(new_df)

输出结果为:

order_id customer_id product_id  sales  product_sum  product_mean  product_count
0        A          X        P1    100          550    183.333333              3
1        A          Y        P2    200          650    216.666667              3
2        B          X        P1    150          550    183.333333              3
3        B          Y        P2    250          650    216.666667              3
4        B          Z        P1    300          550    183.333333              3
5        C          X        P2    200          650    216.666667              3
6        C          Y        P2    150          650    216.666667              3

我们可以看到新生成的DataFrame包括7行数据,每行数据都包括了原始数据集中的信息,以及每个产品的销售总额、销售均价和销售件数。这个操作可以方便我们计算每个订单的销售额相对于同类产品的销售额占比等统计指标。