跳到主要内容

L3-数据处理及可视化

1. pandas库是什么?

Python的pandas库是数据分析领域不可或缺的工具,它提供了高效的数据结构和数据分析功能,使得处理和操作数据变得简单易行。

2. pandas库的安装与导入

在终端输入如下指令进行安装(如果是vscode按下 ctrl + ~ 即可打开终端):

pip install pandas

.py文件开头导入:

import pandas as pd

3. pandas库中的数据结构

3.1 Series:类似一维数组,由一组数据和相应的索引组成

每个元素有一个唯一的索引(称为index),默认从0开始编号。

import pandas as pd

# 创建Series
s= pd.Series(['a','b','c','d','e']) #index=[0,1,2,3,4]
print(s)

也可以为每个元素重新设定唯一的索引(index):

import pandas as pd

# 创建Series
s= pd.Series(['a','b','c','d','e'], index=[1,2,3,4,5])
print(s)

3.2 DataFrame:类似二维表格,由多组数据和相应的索引值组成(由多个Series组成)

Series越多,列越多
Series中的数据越多,行越多

import pandas as pd

# 创建DataFrame
df = pd.DataFrame({
'name':['Zhangsan','Lisi','Wangwu'],
'age':[18,26,35],
'occupation':['student','teacher','doctor']
})
print (df)

4. 查看与操作数据

4.1 查看数据

示例数据集:

import pandas as pd

data = {
"Name": ["Alice", "Bob", "Charlie", "David", "Eve", "Frank"],
"Age": [20, 21, 19, 22, 20, 21],
"Score": [85, 90, 78, 92, 88, 84],
"Grade": ["A", "A", "B", "A", "B", "B"],
"Passed": [True, True, True, True, True, False]
}

df = pd.DataFrame(data)
print("Original DataFrame:")
print(df)

1. df.head() —— 查看前几行数据

默认显示前 5 行,可以传入参数 n 来指定行数。

print("\nFirst 3 rows:")
print(df.head(3)) # 只显示前 3 行

2. df.tail() —— 查看后几行数据

默认显示后 5 行,可以传入参数 n 来指定行数。

print("\nLast 2 rows:")
print(df.tail(2)) # 只显示最后 2 行

3. df.info() —— 显示 DataFrame 的基本信息

  • 列名(Columns)
  • 数据类型(Dtype)
  • 非空值数量(Non-Null Count)
  • 内存占用(Memory Usage)
print("\nDataFrame Info:")
print(df.info())

4. df.describe() —— 显示数值列的统计信息

  • 计数(count)
  • 平均值(mean)
  • 标准差(std)
  • 最小值(min)
  • 25%、50%、75% 分位数(percentiles)
  • 最大值(max)
print("\nDescriptive Statistics:")
print(df.describe())

4.2 选择数据

1. 选择单列数据

使用方括号 [] 选择单列:

print("\n选择 name 列:")
print(df['name'])

2. 选择多列数据

使用双括号 [[]] 选择多列:

print("\n选择 age 和 occupation 列:")
print(df[['age', 'occupation']])

3. 选择单行数据

使用 iloc 按索引位置选择行:

print("\n选择第 1 行数据:")
print(df.iloc[0])

4. 选择多行数据

使用 iloc 切片选择多行:

print("\n选择第 2-3 行数据:")
print(df.iloc[1:3])

5. 根据条件选择数据

使用布尔条件筛选数据:

print("\n选择年龄大于 30 的人员:")
print(df[df['age'] > 30])

4.3 添加与删除与更改数据

1. 添加列数据

直接对新列赋值即可添加列:

# 添加gender列
df['gender'] = ['male', 'female', 'male']
print("\n添加gender列后的数据集:")
print(df)

2. 添加行数据

使用loc索引器添加新行:

# 添加第4行数据
df.loc[3] = ['Xiaoqi', 20, 'student', 'female']
print("\n添加行后的数据集:")
print(df)

3. 删除列数据

使用drop()方法删除列:

# 删除gender列
df = df.drop('gender', axis=1)
print("\n删除gender列后的数据集:")
print(df)

4. 删除行数据

通过索引删除行:

# 删除索引为3的行
df = df.drop(3)
print("\n删除行后的数据集:")
print(df)

5. 修改数据

# 修改单个值
df.loc[1, 'age'] = 36
print("\n修改年龄后的数据集:")
print(df)

# 整列替换
df['occupation'] = ['undergraduate', 'professor', 'surgeon']
print("\n替换职业列后的数据集:")
print(df)

4.4 数据清洗

1. 处理重复数据

使用drop_duplicates()删除完全重复的行:

# 删除重复行(保留第一条)
df_clean = df.drop_duplicates()
print("\n去重后的数据集:")
print(df_clean)

2. 处理缺失值

# 删除含有NaN的行
df_dropna = df.dropna()
print("\n删除缺失值后的数据集:")
print(df_dropna)

# 用0填充NaN
df_fillna = df.fillna(0)
print("\n填充缺失值后的数据集:")
print(df_fillna)

3. 处理异常值

修正超出合理范围的分数(0-100):

# 修正异常分数
score_cols = ['math', 'chinese', 'english']
df[score_cols] = df[score_cols].clip(0, 100)
print("\n修正异常值后的数据集:")
print(df)

4. 计算统计量

添加平均分和中位数列:

# 计算统计量
df['mean'] = df[['math', 'chinese', 'english']].mean(axis=1)
df['median'] = df[['math', 'chinese', 'english']].median(axis=1)
print("\n添加统计量后的数据集:")
print(df)

5. 数据类型转换

转换年龄列为整数类型:

# 安全转换数据类型
df['age'] = pd.to_numeric(df['age'], errors='coerce').astype('Int64')
print("\n转换数据类型后的数据集:")
print(df.dtypes)

6. 重置索引

清理后的索引重整:

# 重置索引(不保留旧索引)
df = df.reset_index(drop=True)
print("\n最终清洗后的数据集:")
print(df)

4.5 数据分析

1. 数据分组统计

# 按班级分组计算平均分
grouped_mean = grades_df.groupby('class')['score'].mean()
print("\n各班级平均分:")
print(grouped_mean)

# 按班级和学科分组计算统计量
grouped_multi = grades_df.groupby(['class', 'subject'])['score'].agg(['mean', 'max', 'count'])
print("\n班级-学科多维统计:")
print(grouped_multi)

2. 数据提取转换

# 提取用户名和域名
extract_result = email_df['email'].str.extract(r'(\w+)\.(\w+)@(\w+)\.(\w+)')
extract_result.columns = ['first_name', 'last_name', 'domain', 'suffix']
print("\n邮箱成分提取结果:")
print(extract_result)

# 提取数学成绩高于80的记录
high_math = grades_df[(grades_df['subject'] == 'math') & (grades_df['score'] > 80)]
print("\n高分数学成绩记录:")
print(high_math)

3. 数据合并连接

# 纵向合并
combined_df = pd.concat([grades_df, new_students], ignore_index=True)
print("\n合并后的数据集:")
print(combined_df.tail(3))

# 横向关联合并
merged_df = pd.merge(combined_df, info_df, on='class')
print("\n关联班级信息后的数据:")
print(merged_df.head(3))

5. 读取文件

1. 读取CSV文件

import pandas as pd

# 基础读取
df_csv = pd.read_csv('data.csv')
print("CSV数据前3行:")
print(df_csv.head(3))

# 带参数读取
df_csv_param = pd.read_csv(
'data.csv',
sep=',', # 分隔符
header=0, # 使用第一行作为列名
encoding='utf-8', # 编码格式
na_values=['NA'] # 自定义缺失值标识
)

2. 读取Excel文件

# 读取单个sheet
df_excel = pd.read_excel('data.xlsx', sheet_name='Sheet1')
print("\nExcel数据前3行:")
print(df_excel.head(3))

# 读取多个sheet
with pd.ExcelFile('data.xlsx') as xls:
df_sheet1 = pd.read_excel(xls, 'Sheet1')
df_sheet2 = pd.read_excel(xls, 'Sheet2')

# 读取所有sheet
excel_all = pd.read_excel('data.xlsx', sheet_name=None)

3. 读取JSON文件

# 标准JSON读取
df_json = pd.read_json('data.json')
print("\nJSON数据:")
print(df_json)

# 处理嵌套JSON
df_json_nested = pd.json_normalize(
pd.read_json('nested.json'),
record_path=['嵌套字段'],
meta=['元信息字段']
)

# JSON字符串解析
json_str = '{"name":"John", "age":30}'
df_from_str = pd.read_json(json_str, orient='index').T

4. 读取SQL数据库

from sqlalchemy import create_engine

# 创建数据库连接
engine = create_engine('sqlite:///example.db')

# 读取单表
df_sql = pd.read_sql('SELECT * FROM table_name', engine)

# 读取表结构信息
table_info = pd.read_sql_table('table_name', engine)

5. 读取HTML表格

# 读取网页表格
url = 'http://example.com/tables.html'
dfs_html = pd.read_html(url)

# 读取本地HTML
dfs_local = pd.read_html('table.html')

# 带参数解析
df_table = pd.read_html(
url,
attrs={'id': 'table1'}, # 指定表格属性
header=0, # 表头行
parse_dates=['日期列'] # 日期解析
)[0] # 返回列表中的第一个表格

总结

pandas是Python数据分析的核心库,提供高效的数据结构和数据处理功能,支持从数据读取、清洗、转换到分析的全流程操作。

核心功能:

数据结构创建

  • pd.Series() - 创建一维数组结构
  • pd.DataFrame() - 创建二维表格结构

数据查看

  • head(n) - 查看前n行数据
  • tail(n) - 查看后n行数据
  • info() - 显示数据基本信息(列名、类型、非空值等)
  • describe() - 显示数值列统计信息(计数、均值、标准差等)

数据选择

  • df['col'] - 选择单列
  • df[['col1','col2']] - 选择多列
  • iloc[] - 按位置索引选择行
  • loc[] - 按标签选择数据

数据操作

  • drop() - 删除指定行或列
  • fillna() - 填充缺失值
  • dropna() - 删除缺失值
  • drop_duplicates() - 删除重复行
  • clip() - 限制数值范围
  • astype() - 转换数据类型
  • reset_index() - 重置索引

数据分析

  • groupby() - 数据分组
  • mean() - 计算平均值
  • max() - 计算最大值
  • min() - 计算最小值
  • count() - 计数
  • agg() - 多函数聚合计算

文件读写

  • read_csv() - 读取CSV文件
  • read_excel() - 读取Excel文件
  • read_json() - 读取JSON文件
  • read_sql() - 读取SQL数据库
  • read_html() - 读取HTML表格

数据合并

  • concat() - 数据纵向合并
  • merge() - 数据横向关联合并