数据仓库与数据挖掘实验练习8

pivot_table()透视表

python 复制代码
sales.pivot_table(
    values = 'Revenue',
    index = 'Date', 
    columns = 'Name',
    aggfunc = 'sum',
    fill_value = 0,
    margins = True,
    margins_name = '总计'
)

使用 Pandas 的 pivot_table 函数将一个名为 sales 的 DataFrame 转化为透视表。

1. sales.pivot_table(...)

  • sales: 这是你的 DataFrame 的名称,包含了你要进行透视分析的数据。

2. values='Revenue'

  • values: 指定你要聚合的列的名称,这里是要聚合 Revenue 列。

3. index='Date'

  • index: 指定要作为透视表行索引的列的名称,这里是要按 Date 列进行分组。

4. columns='Name'

  • columns: 指定要作为透视表列索引的列的名称,这里是要按 Name 列进行分组。

5. aggfunc='sum'

  • aggfunc: 指定对 values 列进行的聚合函数,这里是要对 Revenue 列进行求和。

6. fill_value=0

  • fill_value: 指定透视表中缺失值的填充值,这里将所有缺失值填充为 0。

7. margins=True

  • margins: 指定是否计算行和列的总计,这里是要计算总计。

8. margins_name='总计'

  • margins_name: 指定行和列总计的名称,这里将总计的名称设置为 "总计"。

总结:

这段代码将 sales DataFrame 中 Revenue 列的值按照 Date 列和 Name 列进行分组,并使用 sum 函数对每个分组的 Revenue 值进行求和,最终生成一个透视表。透视表中将 Date 列作为行索引,Name 列作为列索引,每个单元格的值表示对应日期和名字的 Revenue 之和。此外,代码还计算了行和列的总计,并将总计的名称设置为 "总计"。
示例:

假设 sales DataFrame 包含以下数据:

Date Name Revenue
2023-01-01 Alice 100
2023-01-01 Bob 200
2023-01-02 Alice 150
2023-01-02 Charlie 300

执行这段代码后,生成的透视表将如下所示:

Alice Bob Charlie 总计
2023-01-01 100 200 0 300
2023-01-02 150 0 300 450
总计 250 200 300 750

stack() 多变单

将一个多层索引 DataFrame(by_name_and_date)转换为一个单层索引 DataFrame。

解释:

  1. by_name_and_date : 这是一个 DataFrame 对象,其索引是多层的。这意味着它的索引包含多个级别,例如,可能包含 NameDate 两个级别。

  2. stack() : 这是一个 Pandas DataFrame 的方法,用于将 DataFrame 的多层索引转换为单层索引。具体来说,它会将 DataFrame 的列索引(最内层索引)提升到行索引中,并将原来的行索引和列索引合并成一个新的行索引。

示例:

by_name_and_date DataFrame 如下所示:

执行 by_name_and_date.stack() 后,DataFrame 将变为:

unstack() 单变多

将一个多层索引 DataFrame(sales_by_customer)转换为一个具有层次结构的列索引 DataFrame。

解释:

  1. sales_by_customer : 这是一个 DataFrame 对象,其索引是多层的。这意味着它的索引包含多个级别,例如,可能包含 CustomerProduct 两个级别。

  2. unstack(): 这是一个 Pandas DataFrame 的方法,用于将 DataFrame 的行索引(最内层索引)转换为列索引。具体来说,它会将 DataFrame 的行索引中的一个级别提升到列索引中,形成一个层次结构的列索引。

示例:

sales_by_customer DataFrame 如下所示:

执行 sales_by_customer.unstack() 后,DataFrame 将变为:

melt()

melt()函数用于将宽格式的数据转换为长格式。

重要的参数:

  1. id_vars: 可选参数,指定要保留为标识变量的列名列表。这些列的值将被复制到长格式数据的每一行中,以保持其唯一性。

  2. value_vars: 可选参数,指定要转换为长格式的列名列表。如果未指定,则默认为除了"id_vars"之外的所有列。

  3. var_name: 指定在转换后的DataFrame中,新生成的列(用来表示原宽格式列名)的名称,默认为'variable'。

  4. value_name: 指定在转换后的DataFrame中,新生成的列(用来存放原宽格式列的值)的名称,默认为'value'。

  5. col_level: 如果DataFrame有层次化的列名,此参数可以指定哪一层列名用于melting操作。

  6. ignore_index: 布尔值,默认为False。如果设为True,将重置转换后DataFrame的索引。

  7. pivot_names: 仅在Pandas 1.3及更高版本中可用,用于控制是否将原宽格式列名的层次化信息合并为一个变量名。

宽格式(Wide Format)和长格式(Long Format/Tidy Format)

是数据处理和数据分析中两种常见的数据组织形式。

宽格式的特点是每个变量占据一列,而每个观察对象(如不同的时间点、实验条件等)通常占据一行。这种格式适合于查看某个特定时间点或条件下多个变量的值,但在进行时间序列分析、分组操作或绘制涉及多个变量变化的图表时可能会比较复杂。

长格式则将数据重新组织,使得每个观察结果占据一行,且有明确的变量名和对应的值。一般而言,长格式数据包含三个关键元素:识别变量(如个体ID或时间点)、值变量(测量的数值)和一个或多个变量来标记这些值的属性(如变量名或时间点标签)。这种格式非常适合于统计建模、数据可视化,特别是在需要对不同类别或时间点进行比较和汇总时。

例如,假设我们有一个宽格式的表格记录了几个学生在不同科目上的成绩:

复制代码
姓名   数学  英语  物理
张三    90    85    88
李四    80    92    90

转换为长格式后,它会变成:

复制代码
姓名   科目  成绩
张三   数学  90
张三   英语  85
张三   物理  88
李四   数学  80
李四   英语  92
李四   物理  90

在这个转换过程中,每个学生-科目组合变成了一个单独的行,便于分析或绘图时按科目或学生分组。

python 复制代码
video_game_sales.melt(id_vars='Name', value_vars='NA')

解释:

  1. video_game_sales: 这是一个 DataFrame 对象,它包含关于电子游戏销售的数据,可能包含多个列,例如游戏名称、地区销售额等。

  2. melt() : 这是一个 Pandas DataFrame 的方法,用于将 DataFrame 从宽格式转换为长格式 。它将 DataFrame 中的多个列转换为两个新的列:variablevalue

  3. id_vars='Name' : 指定要保留在 DataFrame 中的标识列,这里是要保留 Name 列,即游戏名称。

  4. value_vars='NA' : 指定要转换为长格式的列,这里是要将 NA 列(北美地区的销售额)转换为长格式。

示例:

假设 video_game_sales DataFrame 如下所示:

复制代码
       Name  NA  EU  JP
0  Super Mario  10  5  2
1     Zelda      8  3  4

执行 video_game_sales.melt(id_vars='Name', value_vars='NA') 后,DataFrame 将变为:

复制代码
       Name variable  value
0  Super Mario       NA     10
1     Zelda       NA      8

explode()

recipes.explode('Ingredients')

使用 Pandas 的 explode() 方法将 DataFrame recipes 中的 Ingredients 列展开,将每个包含多个食材的列表拆分成独立的行。

解释:

  1. recipes : 这是一个 DataFrame 对象,包含关于食谱的信息,其中 Ingredients 列存储的是每个食谱的食材列表。
  2. explode('Ingredients') : 这是一个 Pandas DataFrame 的方法,用于将 DataFrame 中的指定列展开。explode() 的参数是列名,这里是要展开 Ingredients 列。
    示例:

假设 recipes DataFrame 如下所示:

复制代码
   Name                                    Ingredients
0  Pizza  ['Tomato sauce', 'Cheese', 'Pepperoni']
1  Salad  ['Lettuce', 'Tomato', 'Cucumber']

执行 recipes.explode('Ingredients') 后,DataFrame 将变为:

复制代码
   Name         Ingredients
0  Pizza  Tomato sauce
1  Pizza           Cheese
2  Pizza       Pepperoni
3  Salad         Lettuce
4  Salad          Tomato
5  Salad        Cucumber

总结:

recipes.explode('Ingredients') 将 DataFrame 中的 Ingredients 列展开,将每个包含多个食材的列表拆分成独立的行,使得每个食材都对应一个独立的行。

练习

1 在 cars 数据集中,聚合汽车价格的总和。在行轴上按燃料类型分组结果。

2 在 cars 数据集中,聚合汽车的数量。在索引轴上按制造商分组,在列轴上按变速箱类型分组。显示行和列的子总数。

3 在 cars 数据集中,聚合汽车价格的平均值。在索引轴上按年份和燃料类型分组,在列轴上按变速箱类型分组。

4 给定上一个挑战中的 DataFrame,将变速箱级别从列轴移动到行轴。

5 将 min_wage 从宽格式转换为窄格式。换句话说,将数据从八个年份列(2010-17)移动到单个列中。

python 复制代码
car = pd.read_csv('used_cars.csv')
car

min_wage = pd.read_csv('minimum_wage.csv')
min_wage.head()

#1.
car.pivot_table(
    values = 'Price',
    index = 'Fuel',
    aggfunc = 'sum'
)

#2.
car.pivot_table(
    values = 'Price',
    index = 'Manufacturer',
    columns = 'Transmission',
    aggfunc = 'count',
    margins = True,
    margins_name = 'Total'
)

#3.
car.pivot_table(
    values = 'Price',
    index = ['Year','Fuel'],
    columns = 'Transmission',
    aggfunc = 'mean'
)

#4.
c1 = car.pivot_table(
    values = 'Price',
    index = ['Year','Fuel'],
    columns = 'Transmission',
    aggfunc = 'mean'
)
c1.stack()

#5.
year = ['2010','2011','2012','2013','2014','2015','2016','2017']
min_wage.melt(id_vars = 'State',var_name = 'Year',value_name = 'wage')
相关推荐
NAGNIP2 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab3 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab3 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP7 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年7 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼7 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS7 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区8 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈8 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang9 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx