数据准备
test-data.csv中的数据
订单ID,商品类别,子类别,销售地区,销售月份,单价,销量,折扣,销售额,利润
1001,电子产品,手机,华东,2024-01,5999,2,0.05,11398.1,1199.8
1002,家居用品,沙发,华北,2024-01,3999,1,0.0,3999.0,799.8
1003,电子产品,笔记本,华南,2024-01,7999,1,0.1,7199.1,1599.8
1004,服装,男装,华东,2024-01,599,3,0.2,1437.6,239.6
1005,家居用品,灯具,华北,2024-02,899,2,0.0,1798.0,359.6
1006,电子产品,平板,华南,2024-02,3499,2,0.05,6648.1,699.8
1007,服装,女装,华东,2024-02,799,4,0.1,2876.4,559.2
1008,家居用品,床垫,华北,2024-02,2999,1,0.0,2999.0,599.8
1009,电子产品,耳机,华南,2024-03,1299,5,0.15,5517.25,899.15
1010,服装,童装,华东,2024-03,399,6,0.2,1149.6,239.4
1011,家居用品,桌椅,华北,2024-03,1599,2,0.0,3198.0,639.6
1012,电子产品,手表,华南,2024-03,1999,3,0.1,5397.3,1079.7
1013,服装,男装,华东,2024-04,699,2,0.05,1328.1,209.7
1014,家居用品,窗帘,华北,2024-04,499,4,0.1,1796.4,359.2
1015,电子产品,手机,华南,2024-04,5999,1,0.0,5999.0,1199.8
1016,服装,女装,华东,2024-04,899,3,0.15,2285.85,419.55
1017,家居用品,地毯,华北,2024-05,799,2,0.0,1598.0,319.6
1018,电子产品,笔记本,华南,2024-05,8999,1,0.05,8549.05,1799.8
1019,服装,童装,华东,2024-05,499,5,0.2,1996.0,399.0
1020,家居用品,灯具,华南,2024-05,999,3,0.1,2697.3,539.1
1021,电子产品,平板,华东,2024-06,3799,2,0.0,7598.0,759.8
1022,服装,男装,华北,2024-06,799,3,0.1,2157.3,419.7
1023,家居用品,沙发,华南,2024-06,4299,1,0.05,4084.05,859.8
1024,电子产品,耳机,华东,2024-06,1499,4,0.15,5096.6,899.4
1025,服装,女装,华北,2024-07,999,2,0.0,1998.0,399.6
import pandas as pd
import numpy as np
df = pd.read_csv("./test-data.csv")
| 订单ID | 商品类别 | 子类别 | 销售地区 | 销售月份 | 单价 | 销量 | 折扣 | 销售额 | 利润 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1001 | 电子产品 | 手机 | 华东 | 2024-01 | 5999 | 2 | 0.05 | 11398.10 | 1199.80 |
| 1 | 1002 | 家居用品 | 沙发 | 华北 | 2024-01 | 3999 | 1 | 0.00 | 3999.00 | 799.80 |
| 2 | 1003 | 电子产品 | 笔记本 | 华南 | 2024-01 | 7999 | 1 | 0.10 | 7199.10 | 1599.80 |
| 3 | 1004 | 服装 | 男装 | 华东 | 2024-01 | 599 | 3 | 0.20 | 1437.60 | 239.60 |
| 4 | 1005 | 家居用品 | 灯具 | 华北 | 2024-02 | 899 | 2 | 0.00 | 1798.00 | 359.60 |
| 5 | 1006 | 电子产品 | 平板 | 华南 | 2024-02 | 3499 | 2 | 0.05 | 6648.10 | 699.80 |
| 6 | 1007 | 服装 | 女装 | 华东 | 2024-02 | 799 | 4 | 0.10 | 2876.40 | 559.20 |
| 7 | 1008 | 家居用品 | 床垫 | 华北 | 2024-02 | 2999 | 1 | 0.00 | 2999.00 | 599.80 |
| 8 | 1009 | 电子产品 | 耳机 | 华南 | 2024-03 | 1299 | 5 | 0.15 | 5517.25 | 899.15 |
| 9 | 1010 | 服装 | 童装 | 华东 | 2024-03 | 399 | 6 | 0.20 | 1149.60 | 239.40 |
| 10 | 1011 | 家居用品 | 桌椅 | 华北 | 2024-03 | 1599 | 2 | 0.00 | 3198.00 | 639.60 |
| 11 | 1012 | 电子产品 | 手表 | 华南 | 2024-03 | 1999 | 3 | 0.10 | 5397.30 | 1079.70 |
| 12 | 1013 | 服装 | 男装 | 华东 | 2024-04 | 699 | 2 | 0.05 | 1328.10 | 209.70 |
| 13 | 1014 | 家居用品 | 窗帘 | 华北 | 2024-04 | 499 | 4 | 0.10 | 1796.40 | 359.20 |
| 14 | 1015 | 电子产品 | 手机 | 华南 | 2024-04 | 5999 | 1 | 0.00 | 5999.00 | 1199.80 |
| 15 | 1016 | 服装 | 女装 | 华东 | 2024-04 | 899 | 3 | 0.15 | 2285.85 | 419.55 |
| 16 | 1017 | 家居用品 | 地毯 | 华北 | 2024-05 | 799 | 2 | 0.00 | 1598.00 | 319.60 |
| 17 | 1018 | 电子产品 | 笔记本 | 华南 | 2024-05 | 8999 | 1 | 0.05 | 8549.05 | 1799.80 |
| 18 | 1019 | 服装 | 童装 | 华东 | 2024-05 | 499 | 5 | 0.20 | 1996.00 | 399.00 |
| 19 | 1020 | 家居用品 | 灯具 | 华南 | 2024-05 | 999 | 3 | 0.10 | 2697.30 | 539.10 |
| 20 | 1021 | 电子产品 | 平板 | 华东 | 2024-06 | 3799 | 2 | 0.00 | 7598.00 | 759.80 |
| 21 | 1022 | 服装 | 男装 | 华北 | 2024-06 | 799 | 3 | 0.10 | 2157.30 | 419.70 |
| 22 | 1023 | 家居用品 | 沙发 | 华南 | 2024-06 | 4299 | 1 | 0.05 | 4084.05 | 859.80 |
| 23 | 1024 | 电子产品 | 耳机 | 华东 | 2024-06 | 1499 | 4 | 0.15 | 5096.60 | 899.40 |
| 24 | 1025 | 服装 | 女装 | 华北 | 2024-07 | 999 | 2 | 0.00 | 1998.00 | 399.60 |
统计函数 sum,max,min,mean,value_counts
# 总销售额
df["销售额"].sum()
100801.1
# 最大的销售额
df["销售额"].max()
11398.1
# 最小的销售额
df["销售额"].min()
1149.6
# 平均销售额
df["销售额"].mean()
4032.0440000000003
# 统计每种商品出现的次数
df["商品类别"].value_counts()
商品类别
电子产品 9
家居用品 8
服装 8
Name: count, dtype: int64
# 商品类别中 出现次数最多的商品,也就是中位数
df["商品类别"].mode()
0 电子产品
Name: 商品类别, dtype: object
# 销售额列 的总数和利润列的总数
df[["销售额","利润"]].sum()
销售额 100801.1
利润 17499.3
dtype: float64
分组groupby
# 按“商品类别”分组,对“销量”求和
category_sales = df.groupby('商品类别')['销量'].sum()
category_sales
商品类别
家居用品 16
服装 28
电子产品 21
Name: 销量, dtype: int64
# 按“商品类别”分组,对“销售额”求和
df.groupby('商品类别')['销售额'].sum()
商品类别
家居用品 22169.75
服装 15228.85
电子产品 63402.50
Name: 销售额, dtype: float64
# 多个分组字段用列表传入
df.groupby(['商品类别', '销售地区'])['利润'].sum()
商品类别 销售地区
家居用品 华北 3077.60
华南 1398.90
服装 华东 2066.45
华北 819.30
电子产品 华东 2859.00
华南 7278.05
Name: 利润, dtype: float64
# numeric_only=True 只处理数值列
df.groupby('销售月份').mean(numeric_only=True)
| 订单ID | 单价 | 销量 | 折扣 | 销售额 | 利润 | |
|---|---|---|---|---|---|---|
| 销售月份 | ||||||
| 2024-01 | 1002.5 | 4649.0 | 1.75 | 0.0875 | 6008.4500 | 959.7500 |
| 2024-02 | 1006.5 | 2049.0 | 2.25 | 0.0375 | 3580.3750 | 554.6000 |
| 2024-03 | 1010.5 | 1324.0 | 4.00 | 0.1125 | 3815.5375 | 714.4625 |
| 2024-04 | 1014.5 | 2024.0 | 2.50 | 0.0750 | 2852.3375 | 547.0625 |
| 2024-05 | 1018.5 | 2824.0 | 2.75 | 0.0875 | 3710.0875 | 764.3750 |
| 2024-06 | 1022.5 | 2599.0 | 2.50 | 0.0750 | 4733.9875 | 734.6750 |
| 2024-07 | 1025.0 | 999.0 | 2.00 | 0.0000 | 1998.0000 | 399.6000 |
# 也 可以先挑选出列 再进行统计
df[["订单ID", "单价", "销量","折扣","销售额","利润",'销售月份']].groupby('销售月份').mean()
| 订单ID | 单价 | 销量 | 折扣 | 销售额 | 利润 | |
|---|---|---|---|---|---|---|
| 销售月份 | ||||||
| 2024-01 | 1002.5 | 4649.0 | 1.75 | 0.0875 | 6008.4500 | 959.7500 |
| 2024-02 | 1006.5 | 2049.0 | 2.25 | 0.0375 | 3580.3750 | 554.6000 |
| 2024-03 | 1010.5 | 1324.0 | 4.00 | 0.1125 | 3815.5375 | 714.4625 |
| 2024-04 | 1014.5 | 2024.0 | 2.50 | 0.0750 | 2852.3375 | 547.0625 |
| 2024-05 | 1018.5 | 2824.0 | 2.75 | 0.0875 | 3710.0875 | 764.3750 |
| 2024-06 | 1022.5 | 2599.0 | 2.50 | 0.0750 | 4733.9875 | 734.6750 |
| 2024-07 | 1025.0 | 999.0 | 2.00 | 0.0000 | 1998.0000 | 399.6000 |
高级操作
map():用于Series(单列),对每个元素执行函数(映射转换)。
apply():可用于Series(逐元素) 或DataFrame(逐行 / 列),执行更复杂的自定义逻辑。
agg():用于分组后的数据,对分组结果执行聚合操作(如求和、均值等)。
map
map():处理单列(Series)的元素级映射
作用:对 Series 中的每个元素应用函数或字典映射,返回新的 Series(长度不变)。
适用场景:值替换、简单转换(如分类值编码、单位转换)。
category_map = {
'电子产品': '电子',
'家居用品': '家居',
'服装': '服饰'
}
# 用 map() 替换 df['类别简称'] = df['商品类别'].map(category_map)
df['类别简称'] = df['商品类别'].map( { '电子产品': '电子','家居用品': '家居','服装': '服饰'} )
df[['商品类别', '类别简称']].head(3)
| 商品类别 | 类别简称 | |
|---|---|---|
| 0 | 电子产品 | 电子 |
| 1 | 家居用品 | 家居 |
| 2 | 电子产品 | 电子 |
# 定义转换函数
def price_level(price):
return '高价' if price > 5000 else '低价'
# 用 map() 应用函数
df['价格等级'] = df['单价'].map(price_level)
df[['价格等级', '单价']].head(3)
| 价格等级 | 单价 | |
|---|---|---|
| 0 | 高价 | 5999 |
| 1 | 低价 | 3999 |
| 2 | 高价 | 7999 |
apply
apply():处理复杂逻辑(支持 Series/DataFrame)
作用:
对 Series:类似 map(),但可处理更复杂的逻辑(如多条件判断)。
对 DataFrame:按行(axis=1)或列(axis=0)应用函数,处理跨列 / 跨行数据。
# 定义复杂逻辑函数
def profit_rating(profit):
if profit > 1000:
return '高利润'
elif profit > 500:
return '中利润'
else:
return '低利润'
# 用 apply() 应用到 Series
df['利润评级'] = df['利润'].apply(profit_rating)
df[['利润', '利润评级']].head(5)
| 利润 | 利润评级 | |
|---|---|---|
| 0 | 1199.8 | 高利润 |
| 1 | 799.8 | 中利润 |
| 2 | 1599.8 | 高利润 |
| 3 | 239.6 | 低利润 |
| 4 | 359.6 | 低利润 |
# 定义跨列计算函数(row 代表一行数据,通过 row['列名'] 访问值)
def profit_rate(row):
return row['利润'] / row['销售额'] # 利润率 = 利润 / 销售额
# 按行应用(axis=1 表示行)
df['利润率'] = df.apply(profit_rate, axis=1)
df[['利润', '销售额', '利润率']].head(3)
| 利润 | 销售额 | 利润率 | |
|---|---|---|---|
| 0 | 1199.8 | 11398.1 | 0.105263 |
| 1 | 799.8 | 3999.0 | 0.200000 |
| 2 | 1599.8 | 7199.1 | 0.222222 |
agg
agg():分组后的聚合操作
作用:对 groupby() 分组后的结果应用聚合函数(如求和、均值),返回聚合后的统计量(长度通常缩短)。
适用场景:分组统计(如按类别求总销量、平均利润)。
# 挑选出
df.groupby('商品类别')['利润'].agg(['sum', 'mean', 'max'])
| sum | mean | max | |
|---|---|---|---|
| 商品类别 | |||
| 家居用品 | 4476.50 | 559.562500 | 859.8 |
| 服装 | 2885.75 | 360.718750 | 559.2 |
| 电子产品 | 10137.05 | 1126.338889 | 1799.8 |
# 按 商品类别 分组,对 销量 求总和,对 利润 求总和与均值。
df.groupby('商品类别').agg(
总销量=('销量', 'sum'),
总利润=('利润', 'sum'),
平均利润=('利润', 'mean')
)
| 总销量 | 总利润 | 平均利润 | |
|---|---|---|---|
| 商品类别 | |||
| 家居用品 | 16 | 4476.50 | 559.562500 |
| 服装 | 28 | 2885.75 | 360.718750 |
| 电子产品 | 21 | 10137.05 | 1126.338889 |
df.groupby(['商品类别', '销售地区']).agg(
总销售额=('销售额', 'sum'),
最大销量=('销量', 'max')
)
| 总销售额 | 最大销量 | ||
|---|---|---|---|
| 商品类别 | 销售地区 | ||
| 家居用品 | 华北 | 15388.40 | 4 |
| 华南 | 6781.35 | 3 | |
| 服装 | 华东 | 11073.55 | 6 |
| 华北 | 4155.30 | 3 | |
| 电子产品 | 华东 | 24092.70 | 4 |
| 华南 | 39309.80 | 5 |

984

被折叠的 条评论
为什么被折叠?



