首页 / 数据采集与处理 / 第5章 数据转换与整合

第5章 数据转换与整合

理论4课时 + 上机4课时 | 难度:中等

5.1 数据合并(merge / concat)

实际工作中,数据往往分散在多个文件或表格里。数据合并就是把多个表按一定规则拼在一起,像拼积木一样。 merge:按共同列把两个表横向拼接,类似SQL的JOIN。 concat:把多个表纵向或横向堆叠。

import pandas as pd # 读取两个表 df1 = pd.read_csv('students.csv') # 学生基本信息 df2 = pd.read_csv('scores.csv') # 学生成绩 # 按"学号"列合并(内连接:只保留两边都有的学号) df_merged = pd.merge(df1, df2, on='学号', how='inner') # how参数说明: # 'inner' - 内连接:只保留两边都有的 # 'left' - 左连接:保留左边全部,右边没有就填NaN # 'right' - 右连接:保留右边全部 # 'outer' - 外连接:两边都保留 # 纵向拼接(比如1月数据和2月数据) df_jan = pd.read_csv('jan.csv') df_feb = pd.read_csv('feb.csv') df_all = pd.concat([df_jan, df_feb], ignore_index=True)

5.2 数据透视(pivot_table)

数据透视表就是按某些维度对数据进行汇总统计。比如你想知道"每个班级、每门课的平均分",就需要透视。

# 创建透视表:按班级和科目统计平均分 pivot = df.pivot_table( values='分数', # 要统计的数值列 index='班级', # 行维度 columns='科目', # 列维度 aggfunc='mean' # 统计方式:mean平均、sum求和、count计数 ) print(pivot) # 多级透视 pivot2 = df.pivot_table( values='销售额', index=['年份', '月份'], columns='地区', aggfunc='sum', fill_value=0 # 空值填0 )

5.3 数据重塑(melt / pivot)

宽格式:每行是一条记录,每列是一个属性,像Excel表格。 长格式:把多列"融化"成两列(变量名+值),适合某些分析场景。 melt把宽变长,pivot把长变宽。

# 宽格式 → 长格式(melt) df_long = pd.melt( df, id_vars=['姓名'], # 保持不变的列 value_vars=['语文', '数学', '英语'], # 要融化的列 var_name='科目', # 新列名:原来的列名 value_name='分数' # 新列名:原来的值 ) # 长格式 → 宽格式(pivot) df_wide = df_long.pivot( index='姓名', columns='科目', values='分数' )

5.4 分组聚合(groupby)

分组聚合就是"先分组,再计算"。比如按"地区"分组,计算每个地区的总销售额。这是数据分析中最常用的操作之一。

# 按单列分组,计算平均值 df.groupby('班级')['成绩'].mean() # 按多列分组 df.groupby(['班级', '性别'])['成绩'].mean() # 多种统计方式同时计算 df.groupby('班级')['成绩'].agg(['mean', 'max', 'min', 'count']) # 对不同列用不同统计方式 df.groupby('班级').agg({ '成绩': 'mean', '出勤率': 'mean', '学号': 'count' })

5.5 数据标准化与归一化

不同列的数据范围可能差很多(比如年龄18-60,收入3000-50000),直接比较不公平。标准化就是把数据缩放到同一尺度。

# Min-Max归一化:缩放到0-1之间 df['收入_归一'] = (df['收入'] - df['收入'].min()) / (df['收入'].max() - df['收入'].min()) # Z-score标准化:均值为0,标准差为1 df['成绩_标准'] = (df['成绩'] - df['成绩'].mean()) / df['成绩'].std() # 使用sklearn(更专业) from sklearn.preprocessing import MinMaxScaler, StandardScaler scaler = MinMaxScaler() df[['收入', '年龄']] = scaler.fit_transform(df[['收入', '年龄']])

自学拓展素材

  • 官方文档:Pandas合并与重塑(pandas.pydata.org/docs/user_guide/merging.html)
  • 视频教程:B站搜索"Pandas groupby详解"
  • 练习数据集:Kaggle的Superstore销售数据集(练习透视表和分组)
  • 在线练习:DataCamp的"Data Manipulation with Pandas"课程
  • 工具:Excel的数据透视表功能(对比学习,理解原理)

自学自检小问题

  1. merge和concat有什么区别?分别在什么场景使用?
  2. pivot_table中的aggfunc参数可以填哪些值?各代表什么含义?
  3. groupby之后可以接哪些操作?写出至少3种。
  4. 宽格式和长格式各有什么优缺点?什么时候需要转换?
  5. Min-Max归一化和Z-score标准化的结果范围分别是多少?
基础巩固层练习
0/5
第1题 选择题
将两个DataFrame按共同列横向拼接,应使用?
pd.concat()
pd.merge()
df.join()
df.append()
答案解析
pd.merge()按共同列进行横向拼接(类似SQL JOIN)。pd.concat()主要用于纵向堆叠。
第2题 选择题
以下哪个函数用于按指定列对DataFrame进行分组?
merge()
concat()
groupby()
pivot()
答案解析
groupby()用于按指定列对数据进行分组,后续可接聚合函数如mean()、sum()等。
第3题 选择题
Min-Max归一化后,数据的范围是?
(-1, 1)
(0, 1)
均值为0
标准差为1
答案解析
Min-Max归一化将数据缩放到0到1之间。Z-score标准化才是均值为0、标准差为1。
第4题 选择题
df.pivot_table中的aggfunc='mean'表示?
求和
计数
求平均值
求最大值
答案解析
aggfunc='mean'表示对数据进行求平均值操作。sum是求和,count是计数,max是求最大值。
第5题 填空题
Pandas中,将两个DataFrame按共同列拼接的函数是 ______,将多个DataFrame纵向堆叠的函数是 ______。
答案解析
pd.merge()用于按共同列横向拼接(类似SQL JOIN),pd.concat()用于纵向或横向堆叠多个DataFrame。
0/0