跳转至

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

Python
df = df.assign(
    total=lambda x: x['price'] * x['quantity'],
    tax=lambda x: x['total'] * 0.1
)

📝 练习

  1. 读取CSV文件并进行基本的数据清洗
  2. 计算各分组的统计信息
  3. 合并多个数据源

🎯 自我检查

  • 能创建和操作DataFrame
  • 能进行数据清洗
  • 理解分组聚合
  • 能处理实际问题

下一步: 03 - 数据可视化