【数据分析面试】49. 计算分公司的总销售额(Python:groupby & merge用法)

在这里插入图片描述

题目:

你在一家跨国零售公司工作,全球各分公司的销售数据都存储在不同的表格中。当前的数据结构在业务分析中表现低效,管理层需要你提供专业知识来简化数据。

编写一个Python程序,创建一个数据表,显示每个分支机构每年的总销售额。

注意:假设销售额用 total_sales 列表示,单位为美元。每个分支机构由其唯一的 branch_id 表示。

示例:

输入:
为了简化,考虑两年:2021年和2022年。

import pandas as pd

data_2021 = {
    'id': [1, 2, 3, 4],
    'branch_id': [101, 102, 101, 103],
    'total_sales': [5000, 7000, 3000, 1000]
}

data_2022 = {
    'id': [1, 2, 3, 4],
    'branch_id': [101, 102, 103, 104],
    'total_sales': [6000, 8000, 2000, 4000]
}

df_2021 = pd.DataFrame(data_2021)
df_2022 = pd.DataFrame(data_2022)

输出:

sales_pivot 表:

列名类型
branch_idINTEGER
total_sales_2021INTEGER
total_sales_2022INTEGER

该数据表显示了每个分支机构每年的总销售额。

答案

解题思路

要在Python中创建数据表,我们可以使用pandas库。具体步骤如下:

  1. 2021年和2022年的销售数据表中读取数据。
  2. 使用groupbysum来计算每个分支机构每年的总销售额。
  3. 将两个年份的数据合并在一起,创建一个数据表。

答案代码

def cal(df_2021,df_2022):
    # 创建DataFrame
    df_2021 = pd.DataFrame(data_2021)
    df_2022 = pd.DataFrame(data_2022)

    # 计算每个分支机构的总销售额
    sales_2021 = df_2021.groupby('branch_id')['total_sales'].sum().reset_index()
    sales_2022 = df_2022.groupby('branch_id')['total_sales'].sum().reset_index()

    # 重命名列以反映年份
    sales_2021.columns = ['branch_id', 'total_sales_2021']
    sales_2022.columns = ['branch_id', 'total_sales_2022']

    # 合并数据,如果有缺失值用0表示
    sales_pivot = pd.merge(sales_2021, sales_2022, on='branch_id', how='outer').fillna(0)
    return sales_pivot

# 计算结果
cal(df_2021,df_2022)
  • df.groupby(['branch_id'])['total_sales']:按照 branch_id 列进行分组,对total sales进行聚合操作。
  • .sum():对每组的 total_sales 列进行求和。
  • .reset_index(): 重置索引,将分组键转化为普通列。

Pandas语法介绍

GroupBy()

GroupBy() 是 pandas 中用于对数据进行分组和聚合的函数。和SQL 中的 GROUP BY 功能一样,常用于数据统计分析,但在python中的语法不一致,例如上面答案中df.groupby(['分组列'])['聚合列'].sum()

其基本语法如下:

df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, dropna=True)

常用参数

  • by: 指定用于分组的列名或函数。可以是单个列名、列表或字典。
  • axis: 分组轴,0 或 ‘index’ 表示按行分组,1 或 ‘columns’ 表示按列分组(默认是 0)。
  • level: 用于分组的级别(对于 MultiIndex)。
  • as_index: 如果为 True,分组的键会成为结果 DataFrame 的索引(默认是 True)。
  • sort: 如果为 True,按照分组键对结果排序(默认是 True)。
  • group_keys: 如果为 True,保留分组键(默认是 True)。
  • squeeze: 如果为 True,尝试压缩结果的维度(默认是 False)。
  • observed: 如果为 True,仅考虑分类数据中的观察到的值(适用于分类变量,默认是 False)。
  • dropna: 如果为 True,丢弃所有分组键中包含 NaN 的分组(默认是 True)。
Merge()

Merge() 是 pandas 中用于合并两个 DataFrame 的函数。Merge() 和SQL语言中的连接Join用法相似,参数中也有left、right join等连接方式,以及通过on选择链接键。其基本语法如下:

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, suffixes=('_x', '_y'))

常用参数

  • left: 左侧要合并的 DataFrame。
  • right: 右侧要合并的 DataFrame。
  • how: 合并方式,可以是 ‘left’、‘right’、‘outer’ 或 ‘inner’(默认是 ‘inner’)。
  • on: 用于连接的列名,当左右 DataFrame 的列名相同时使用。
  • left_on: 左侧 DataFrame 中用作连接键的列名。
  • right_on: 右侧 DataFrame 中用作连接键的列名。
  • left_index: 如果为 True,使用左侧 DataFrame 的索引进行连接。
  • right_index: 如果为 True,使用右侧 DataFrame 的索引进行连接。
  • suffixes: 用于结果 DataFrame 中重复列名的后缀,默认是 (‘_x’, ‘_y’)。

更多详细答案可关注公众号查阅。
在这里插入图片描述

  • 21
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值