📅  最后修改于: 2023-12-03 15:26:34.216000             🧑  作者: Mango
在数据分析中,使用 Pandas 中的 groupby 函数可以根据一个或多个条件将数据集分组,然后对每个分组应用任意的聚合函数,如 mean、sum、count 等等。而在对 DataFrame 进行聚合操作后,我们可能需要对结果进行计算或者进行其他的处理,这时候,我们可以使用 Pandas 中的 agg 函数,它可以传递自定义的函数实现指定的计算或操作。
在这个过程中,我们有时可能会希望将聚合后得到的结果转换为一个新的 DataFrame,并对它进行进一步操作。下面就来介绍如何通过 groupby 函数和 agg 函数实现这个功能。
首先,假设我们有一个包含销售记录的 DataFrame,其中包含了销售日期、客户姓名、商品名称和销售金额。
import pandas as pd
df = pd.DataFrame({
'date': ['2021-01-01', '2021-01-02', '2021-01-02', '2021-01-03', '2021-01-03'],
'customer': ['A', 'B', 'B', 'A', 'C'],
'product': ['iPhone', 'iPad', 'iPhone', 'iPhone', 'MacBook'],
'amount': [1000, 500, 800, 1200, 2000]
})
df
输出结果如下:
date customer product amount
0 2021-01-01 A iPhone 1000
1 2021-01-02 B iPad 500
2 2021-01-02 B iPhone 800
3 2021-01-03 A iPhone 1200
4 2021-01-03 C MacBook 2000
我们可以使用 groupby 函数按照客户和商品进行分组,然后计算每个客户和商品的总销售额。接下来我们将得到的结果转换为一个新的 DataFrame,并在其中增加一列,表示销售总额占全部销售额的比例。
def add_ratio(df):
df['ratio'] = df['amount'] / df['amount'].sum()
return df
new_df = (df.groupby(['customer', 'product'])['amount']
.sum()
.reset_index()
.pipe(add_ratio))
new_df
代码解析:
df.groupby(['customer', 'product'])['amount']
:按客户和商品进行分组,并选择销售金额这一列进行聚合操作。.sum()
:对每个分组的销售金额求和。.reset_index()
:将多层索引转换为列。.pipe(add_ratio)
:将得到的结果传递给自定义的函数 add_ratio,该函数计算销售总额占全部销售额的比例,并将结果添加到 DataFrame 中。输出结果如下:
customer product amount ratio
0 A iPhone 2200 0.324324
1 B iPad 500 0.020270
2 B iPhone 800 0.034324
3 C MacBook 2000 0.620081
我们可以看到,new_df 是一个包含客户、商品、销售金额和销售总额占比的新 DataFrame。这个过程中,首先使用 groupby 函数按照客户和商品进行分组,计算每个客户和商品的总销售额;然后通过 reset_index 函数将多层索引转换为列;最后使用自定义函数 add_ratio 计算销售总额占比,并将结果添加到 DataFrame 中。