第145集:Pandas DataFrame
1. 什么是DataFrame
DataFrame是Pandas中最核心的数据结构,用于表示二维表格数据。它由行和列组成,类似于Excel表格或SQL表。DataFrame具有以下特点:
- 每一列可以是不同的数据类型(整数、浮点数、字符串等)
- 支持行索引和列索引
- 提供了丰富的数据操作和分析功能
- 可以轻松处理缺失值
- 支持数据的导入和导出
2. DataFrame的创建方法
2.1 从列表创建DataFrame
import pandas as pd
# 从嵌套列表创建
data = [['张三', 25, 88], ['李四', 28, 92], ['王五', 26, 85]]
df1 = pd.DataFrame(data, columns=['姓名', '年龄', '成绩'])
print(df1)2.2 从字典创建DataFrame
# 从字典创建
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 28, 26],
'成绩': [88, 92, 85]
}
df2 = pd.DataFrame(data)
print(df2)2.3 从NumPy数组创建DataFrame
import numpy as np
# 从NumPy数组创建
arr = np.array([[25, 88], [28, 92], [26, 85]])
df3 = pd.DataFrame(arr, index=['张三', '李四', '王五'], columns=['年龄', '成绩'])
print(df3)2.4 从Series创建DataFrame
# 从Series创建
s1 = pd.Series(['张三', '李四', '王五'], name='姓名')
s2 = pd.Series([25, 28, 26], name='年龄')
s3 = pd.Series([88, 92, 85], name='成绩')
df4 = pd.DataFrame({'姓名': s1, '年龄': s2, '成绩': s3})
print(df4)3. DataFrame的属性
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 28, 26],
'成绩': [88, 92, 85]
})
print(df.values) # 数据值(NumPy数组)
print(df.index) # 行索引
print(df.columns) # 列索引
print(df.dtypes) # 列数据类型
print(df.shape) # 形状(行数, 列数)
print(df.size) # 元素总数
print(df.ndim) # 维度
print(df.empty) # 是否为空
print(df.head()) # 前几行(默认5行)
print(df.tail()) # 后几行(默认5行)4. DataFrame的索引和切片
4.1 选择列
# 选择单个列
df['姓名'] # 或 df.姓名
# 选择多个列
df[['姓名', '成绩']]4.2 选择行
# 基于位置的索引
print(df.iloc[0]) # 第一行
print(df.iloc[0:2]) # 前两行
print(df.iloc[[0, 2]]) # 第一行和第三行
# 基于标签的索引
print(df.loc[0]) # 标签为0的行4.3 选择行和列
# iloc:位置索引
print(df.iloc[0, 0]) # 第一行第一列
print(df.iloc[0:2, 1:3]) # 前两行的后两列
# loc:标签索引
print(df.loc[0, '姓名']) # 标签为0的行,列名为'姓名'
print(df.loc[0:1, ['姓名', '成绩']]) # 标签0-1的行,列名为'姓名'和'成绩'4.4 条件索引
# 选择成绩大于90的行
print(df[df['成绩'] > 90])
# 选择年龄大于25且成绩大于85的行
print(df[(df['年龄'] > 25) & (df['成绩'] > 85)])5. DataFrame的基本操作
5.1 添加列
# 添加新列
df['性别'] = ['男', '女', '男']
# 基于已有列创建新列
df['优秀'] = df['成绩'] >= 90
print(df)5.2 删除列
# 删除列
df = df.drop('优秀', axis=1) # axis=1表示列
# 或 del df['优秀']5.3 添加行
# 添加新行
new_row = pd.DataFrame({'姓名': ['赵六'], '年龄': [27], '成绩': [89]})
df = pd.concat([df, new_row], ignore_index=True)5.4 删除行
# 删除行
df = df.drop(3, axis=0) # axis=0表示行5.5 修改值
# 修改单个值
df.loc[0, '年龄'] = 26
# 修改多个值
df.loc[0:1, '成绩'] = [89, 93]5.6 排序
# 按列排序
df_sorted = df.sort_values(by='成绩', ascending=False) # 降序
# 按索引排序
df_sorted = df.sort_index()6. 缺失值处理
# 创建包含缺失值的DataFrame
df_missing = pd.DataFrame({
'姓名': ['张三', '李四', None, '王五'],
'年龄': [25, None, 26, 28],
'成绩': [88, 92, 85, None]
})
# 检查缺失值
print(df_missing.isnull())
print(df_missing.notnull())
# 过滤缺失值
print(df_missing.dropna()) # 删除包含缺失值的行
print(df_missing.dropna(axis=1)) # 删除包含缺失值的列
# 填充缺失值
print(df_missing.fillna(0)) # 用0填充
print(df_missing.fillna({'姓名': '未知', '年龄': df_missing['年龄'].mean(), '成绩': df_missing['成绩'].mean()})) # 按列填充
print(df_missing.fillna(method='ffill')) # 向前填充
print(df_missing.fillna(method='bfill')) # 向后填充7. 案例分析:学生成绩统计
# 创建学生成绩DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
'班级': ['一班', '一班', '二班', '二班', '三班', '三班'],
'语文': [88, 92, 85, 90, 87, 89],
'数学': [95, 88, 92, 87, 90, 85],
'英语': [90, 93, 88, 85, 89, 91]
}
students_df = pd.DataFrame(data)
# 1. 计算每个学生的总成绩和平均分
students_df['总成绩'] = students_df['语文'] + students_df['数学'] + students_df['英语']
students_df['平均分'] = students_df['总成绩'] / 3
# 2. 按班级分组统计
class_stats = students_df.groupby('班级').agg({
'语文': ['mean', 'max', 'min'],
'数学': ['mean', 'max', 'min'],
'英语': ['mean', 'max', 'min'],
'总成绩': ['mean', 'max', 'min']
})
# 3. 找出每个班级的最高分学生
top_students = students_df.loc[students_df.groupby('班级')['总成绩'].idxmax()]
print(students_df)
print(class_stats)
print(top_students)8. 总结
- DataFrame是Pandas中用于表示二维表格数据的核心结构
- 支持多种创建方式:列表、字典、NumPy数组等
- 提供丰富的索引和切片方式:iloc(位置)和loc(标签)
- 支持缺失值处理、排序、分组等操作
- 可以轻松进行数据分析和统计计算
9. 代码练习
请参考code/第145集_Pandas DataFrame演示.py文件进行实际操作练习。
在下一集中,我们将学习DataFrame的高级操作,包括数据合并、重塑和透视等功能。