题目:
你在一家跨国零售公司工作,全球各分公司的销售数据都存储在不同的表格中。当前的数据结构在业务分析中表现低效,管理层需要你提供专业知识来简化数据。
编写一个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_id | INTEGER |
total_sales_2021 | INTEGER |
total_sales_2022 | INTEGER |
该数据表显示了每个分支机构每年的总销售额。
答案
解题思路
要在Python中创建数据表,我们可以使用pandas库。具体步骤如下:
- 从
2021
年和2022
年的销售数据表中读取数据。 - 使用
groupby
和sum
来计算每个分支机构每年的总销售额。 - 将两个年份的数据合并在一起,创建一个数据表。
答案代码
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’)。
更多详细答案可关注公众号查阅。