📜  来自 groupby 的 pandas new df - Python (1)

📅  最后修改于: 2023-12-03 15:26:34.216000             🧑  作者: Mango

来自 groupby 的 pandas new df - Python

在数据分析中,使用 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 中。