数据科学和机器学习的“看家兵器”——pandas模块 之五
目录
4.5 pandas 高级数据处理与分析
一、课程目标
二、对数据表格进行处理
(一)行列转置
(二)将数据表转换为树形结构
三、数据表的拼接
(一)merge () 函数的运用
(二)concat () 函数的运用
(三)append () 函数的运用
四、对数据表格的同级运算
五、计算数据表格中数值的分布情况
六、对数据表中的相关性进行计算
七、对数据进行分类汇总
八、创建数据透视表
九、课程回顾和小结
十、课后练习
4.5 pandas 高级数据处理与分析
一、课程目标
本次课程主要围绕 pandas 的高级数据处理与分析功能展开,通过理论讲解和案例分析,让学员掌握数据转置、表格拼接、统计运算、相关性分析、分类汇总、数据透视表等高级操作技巧。学员学完本次课程后,能够熟练使用 pandas 进行复杂的数据处理和深度数据分析。
二、对数据表格进行处理
在数据分析过程中,我们经常需要对数据表格进行各种处理,包括行列转置和转换为树形结构。
(一)行列转置
行列转置是将数据表格的行和列互换位置。
import pandas as pd
import numpy as np# 创建示例数据
np.random.seed(42)
data = {'姓名': ['张三', '李四', '王五', '赵六'],'语文': [85, 90, 78, 88],'数学': [92, 87, 95, 80],'英语': [88, 91, 85, 92]
}
df = pd.DataFrame(data)
df = df.set_index('姓名')print("原始数据:")
print(df)# 行列转置
df_transposed = df.T
print("\n转置后的数据:")
print(df_transposed)# 恢复索引
df_transposed = df_transposed.reset_index()
df_transposed = df_transposed.rename(columns={'index': '科目'})
print("\n恢复索引后的数据:")
print(df_transposed)
这个案例展示了如何使用T属性对数据表格进行行列转置,以及如何恢复索引并修改列名。
(二)将数据表转换为树形结构
将数据表转换为树形结构可以更直观地展示数据之间的层次关系。
# 创建树形结构数据
tree_data = {'id': [1, 2, 3, 4, 5, 6, 7],'parent_id': [None, 1, 1, 2, 2, 3, 3],'name': ['A', 'B', 'C', 'D', 'E', 'F', 'G'],'value': [10, 20, 30, 40, 50, 60, 70]
}
df_tree = pd.DataFrame(tree_data)print("原始树形结构数据:")
print(df_tree)# 定义构建树形结构的函数
def build_tree(df, parent_id=None):tree = []children = df[df['parent_id'] == parent_id]for _, child in children.iterrows():node = {'id': child['id'],'name': child['name'],'value': child['value'],'children': build_tree(df, child['id'])}tree.append(node)return tree# 构建树形结构
tree = build_tree(df_tree)
print("\n转换后的树形结构:")
import json
print(json.dumps(tree, indent=2, ensure_ascii=False))
这个案例展示了如何将数据表转换为树形结构。通过递归函数,可以将具有父子关系的数据转换为嵌套的字典列表形式,便于进行树形结构的展示和分析。
三、数据表的拼接
在数据分析过程中,我们经常需要将多个数据表拼接在一起。pandas 提供了多种拼接数据表的方法。
(一)merge () 函数的运用
merge()函数用于根据一个或多个键将不同 DataFrame 中的行连接起来。
# 创建示例数据
df1 = pd.DataFrame({'学号': [1001, 1002, 1003, 1004],'姓名': ['张三', '李四', '王五', '赵六'],'班级': ['一班', '二班', '一班', '二班']
})df2 = pd.DataFrame({'学号': [1001, 1002, 1003, 1005],'成绩': [85, 90, 78, 88]
})print("df1:")
print(df1)
print("\ndf2:")
print(df2)# 内连接
df_inner = pd.merge(df1, df2, on='学号', how='inner')
print("\n内连接结果:")
print(df_inner)# 左连接
df_left = pd.merge(df1, df2, on='学号', how='left')
print("\n左连接结果:")
print(df_left)# 右连接
df_right = pd.merge(df1, df2, on='学号