02 - Pandas入门¶
学习时间: 5-6小时 重要性: ⭐⭐⭐⭐⭐ 数据分析的核心工具
🎯 学习目标¶
- 掌握DataFrame的基本操作
- 学会数据清洗
- 理解数据聚合和分组
🐼 Pandas简介¶
Python
import pandas as pd
import numpy as np
# Pandas是什么?
# 1. 数据分析神器
# 2. 基于NumPy构建
# 3. 提供Series和DataFrame两种数据结构
# 4. 适合处理表格型数据
# 为什么用Pandas?
# - 类似Excel,但更强大
# - 处理大规模数据
# - 丰富的数据操作
# - 与机器学习库无缝集成
📊 Series和DataFrame¶
Series - 一维数据¶
Python
import pandas as pd
# 创建Series
s = pd.Series([1, 2, 3, 4, 5])
print(s)
# 0 1
# 1 2
# 2 3
# ...
# 带索引的Series
s = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
print(s['a']) # 1
# 从字典创建
s = pd.Series({'a': 1, 'b': 2, 'c': 3})
# Series操作
print(s + 10) # 加法
print(s[s > 1]) # 过滤
print(s.mean()) # 平均值
DataFrame - 二维表格¶
Python
# 创建DataFrame
data = {
'name': ['张三', '李四', '王五'],
'age': [25, 30, 35],
'city': ['北京', '上海', '深圳']
}
df = pd.DataFrame(data)
print(df)
# 从列表创建
df = pd.DataFrame([
['张三', 25, '北京'],
['李四', 30, '上海']
], columns=['name', 'age', 'city'])
# 读取CSV(最常用)
df = pd.read_csv('data.csv')
df.to_csv('output.csv', index=False)
# 读取Excel
df = pd.read_excel('data.xlsx')
df.to_excel('output.xlsx', index=False)
🔍 数据查看与选择¶
基本查看¶
Python
df = pd.read_csv('data.csv')
# 查看数据
print(df.head()) # 前5行
print(df.tail(10)) # 后10行
print(df.info()) # 数据信息
print(df.describe()) # 统计摘要
print(df.shape) # 形状(行数,列数)
print(df.columns) # 列名
print(df.dtypes) # 数据类型
数据选择¶
Python
# 选择列
df['name'] # 单列(Series)
df[['name', 'age']] # 多列(DataFrame)
# 选择行(位置)
df.iloc[0] # 第一行
df.iloc[0:5] # 前5行
df.iloc[0:5, 0:2] # 前5行的前2列
# 选择行(标签)
df.loc[0] # 索引为0的行
df.loc[0:5] # 索引0-5的行
# 条件过滤
df[df['age'] > 30] # age大于30的行
df[(df['age'] > 25) & (df['city'] == '北京')] # 多条件
df[df['name'].isin(['张三', '李四'])] # 在列表中
# 使用query(更清晰)
df.query('age > 30 and city == "北京"')
🧹 数据清洗¶
处理缺失值¶
Python
# 检查缺失值
df.isnull().sum() # 每列的缺失值数量
df.isnull().sum().sum() # 总缺失值数量
# 删除缺失值
df.dropna() # 删除任何有缺失值的行
df.dropna(axis=1) # 删除有缺失值的列
df.dropna(subset=['age']) # 只检查age列
# 填充缺失值
df.fillna(0) # 用0填充
df.fillna(df.mean()) # 用平均值填充
df['age'].fillna(df['age'].median(), inplace=True) # 用中位数
# 前向/后向填充
df.ffill() # 前向填充(Pandas 2.1+ 推荐写法)
df.bfill() # 后向填充
处理重复值¶
Python
# 检查重复
df.duplicated() # 是否重复
df.duplicated().sum() # 重复行数量
# 删除重复
df.drop_duplicates() # 删除所有重复行
df.drop_duplicates(subset=['name']) # 只检查name列
df.drop_duplicates(keep='last') # 保留最后一个
类型转换¶
Python
# 转换类型
df['age'] = df['age'].astype(int)
df['price'] = pd.to_numeric(df['price'])
df['date'] = pd.to_datetime(df['date'])
# 分类类型(节省内存)
df['category'] = df['category'].astype('category')
重命名和排序¶
Python
# 重命名
df.rename(columns={'old_name': 'new_name'})
df.rename(index={0: 'first'})
# 排序
df.sort_values('age') # 按age升序
df.sort_values('age', ascending=False) # 降序
df.sort_values(['age', 'name']) # 多列排序
df.sort_index() # 按索引排序
📈 数据操作¶
添加和修改列¶
Python
# 添加列
df['total'] = df['price'] * df['quantity']
df['year'] = 2026
# 修改列
df['age'] = df['age'] + 1
# 应用函数
df['name_upper'] = df['name'].apply(str.upper)
df['age_category'] = df['age'].apply(lambda x: 'young' if x < 30 else 'old') # lambda定义匿名函数,适用于简单的单行表达式
# 删除列
df.drop('column_name', axis=1)
df.drop(columns=['col1', 'col2'])
字符串操作¶
Python
# 字符串方法
df['name'].str.lower() # 转小写
df['name'].str.upper() # 转大写
df['name'].str.contains('张') # 是否包含
df['name'].str.replace('old', 'new') # 替换
df['email'].str.split('@') # 分割
df['name'].str.len() # 长度
df['name'].str.strip() # 去除空格
📊 数据聚合与分组¶
基本聚合¶
Python
# 单列聚合
df['age'].mean()
df['price'].sum()
df['quantity'].max()
# 多列聚合
df[['age', 'price']].mean()
# describe()汇总
df.describe()
df['age'].describe()
分组操作(重要!)¶
Python
# 按列分组
grouped = df.groupby('city')
# 分组聚合
df.groupby('city')['age'].mean() # 每个城市的平均年龄
df.groupby('city')['salary'].sum() # 每个城市的工资总和
df.groupby('city').size() # 每个组的大小
# 多种聚合
df.groupby('city')['age'].agg(['mean', 'max', 'min'])
# 多列聚合
df.groupby('city').agg({
'age': 'mean',
'salary': ['sum', 'mean']
})
# 多列分组
df.groupby(['city', 'department'])['salary'].mean()
# 遍历分组
for name, group in df.groupby('city'):
print(f"城市: {name}")
print(group)
🔄 数据合并¶
Python
# 拼接
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
pd.concat([df1, df2]) # 垂直拼接
pd.concat([df1, df2], axis=1) # 水平拼接
# 合并(类似SQL JOIN)
df1 = pd.DataFrame({'key': ['A', 'B'], 'value1': [1, 2]})
df2 = pd.DataFrame({'key': ['A', 'B'], 'value2': [3, 4]})
pd.merge(df1, df2, on='key') # 内连接
pd.merge(df1, df2, on='key', how='left') # 左连接
pd.merge(df1, df2, on='key', how='right') # 右连接
pd.merge(df1, df2, on='key', how='outer') # 外连接
💡 实用技巧¶
技巧1: 链式操作¶
Python
result = (df
.query('age > 25')
.groupby('city')
.agg({'salary': 'mean'})
.sort_values('salary', ascending=False)
.head(10)
)
技巧2: 使用assign¶
📝 练习¶
- 读取CSV文件并进行基本的数据清洗
- 计算各分组的统计信息
- 合并多个数据源
🎯 自我检查¶
- 能创建和操作DataFrame
- 能进行数据清洗
- 理解分组聚合
- 能处理实际问题
下一步: 03 - 数据可视化