🐼 Pandas基础

从零开始的数据分析之旅

📖 Pandas核心:Series与DataFrame

Pandas是Python数据分析的核心库,提供了两种主要数据结构:Series(一维)和DataFrame(二维)。DataFrame就像Excel表格或SQL表,但强大得多——支持复杂的数据操作、分析和可视化。

Pandas数据结构: Series (一维) DataFrame (二维) ───────────── ──────────────── 索引 + 值 行索引 + 列名 + 值 ├ 自动索引 ├ 字典创建 ├ 自定义索引 ├ 列表创建 ├ 命名 ├ NumPy创建 └ 支持运算 └ 读取文件 核心操作: ├ 创建/构造 ├ 选择/过滤 ← 本课重点 ├ 排序/排名 ├ 统计/聚合 └ 应用函数

1. DataFrame创建

import pandas as pd
import numpy as np

# 从字典创建
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六', '孙七'],
    '年龄': [22, 25, 28, 22, 30],
    '成绩': [85, 92, 78, 95, 88],
    '城市': ['北京', '上海', '广州', '北京', '深圳']
})

# 从NumPy创建
df2 = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))

# 从列表创建
df3 = pd.DataFrame([
    {'姓名': '张三', '成绩': 85},
    {'姓名': '李四', '成绩': 92}
])

🎯 数据选择:loc vs iloc

方法索引类型语法特点
loc标签索引df.loc[行标签, 列标签]包含末端
iloc位置索引df.iloc[行号, 列号]不包含末端
[]列选择df['列名']返回Series
[[]]多列选择df[['列1','列2']]返回DataFrame
# loc: 按标签选择(包含末端!)
df.loc[0:2, ['姓名', '成绩']]     # 行0到2,姓名和成绩列

# iloc: 按位置选择(不包含末端!)
df.iloc[1:3, 0:2]                # 行1到2,前两列

# 条件过滤
df[df['成绩'] >= 90]              # 成绩>=90的行
df[(df['城市'] == '北京') & (df['年龄'] == 22)]  # 多条件

# isin过滤
df[df['城市'].isin(['北京', '上海'])]
loc切片包含末端iloc切片不包含末端!这是Pandas最常见的陷阱之一。

📊 数据操作与统计

排序

# 按值排序
df.sort_values('成绩', ascending=False)  # 降序

# 按索引排序
df.sort_index()

# 多列排序
df.sort_values(['城市', '成绩'], ascending=[True, False])

描述统计

# 快速统计摘要
df.describe()

# 单列统计
df['成绩'].mean()    # 均值
df['成绩'].median()  # 中位数
df['成绩'].std()     # 标准差

# 值计数
df['城市'].value_counts()

# 唯一值
df['城市'].unique()     # 返回数组
df['城市'].nunique()    # 唯一值数量

apply函数

# 自定义函数应用
df['等级'] = df['成绩'].apply(
    lambda x: 'A' if x >= 90 else 'B' if x >= 80 else 'C'
)

# 多列操作
df['评级'] = df.apply(
    lambda row: '优秀' if row['成绩'] >= 90 and row['年龄'] < 25 else '良好',
    axis=1
)

📐 2024-2025 Pandas前沿

🔄 Series详解

import pandas as pd

# Series运算(对齐索引)
s_a = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
s_b = pd.Series([10, 20, 30], index=['b', 'c', 'd'])
result = s_a + s_b  # 索引对齐,不匹配为NaN

# 常用方法
print(s_a.values)      # numpy数组
print(s_a.index)       # 索引对象
print(s_a.describe())  # 统计摘要

📈 数据导入导出

# CSV
df = pd.read_csv('data.csv')
df.to_csv('output.csv', index=False)

# Excel
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
df.to_excel('output.xlsx')

# JSON
df = pd.read_json('data.json')
df.to_json('output.json', orient='records', force_ascii=False)

# SQL
from sqlalchemy import create_engine
engine = create_engine('sqlite:///db.db')
df = pd.read_sql('SELECT * FROM table', engine)

# 读取选项
df = pd.read_csv('data.csv',
    encoding='utf-8',
    usecols=['A', 'B'],     # 只读指定列
    nrows=1000,             # 只读前N行
    dtype={'age': int},     # 指定类型
    parse_dates=['date'],   # 解析日期
    chunksize=10000)        # 分块读取
读取大文件用chunksize分块,或dtype指定类型减少内存。用df.info(memory_usage='deep')查看实际内存。

💻 完整实战代码

#!/usr/bin/env python3
# Pandas基础 — 完整实战

import pandas as pd
import numpy as np

# ============ DataFrame创建 ============
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六', '孙七'],
    '年龄': [22, 25, 28, 22, 30],
    '成绩': [85, 92, 78, 95, 88],
    '城市': ['北京', '上海', '广州', '北京', '深圳']
})
print(f"DataFrame:\n{df}")
print(f"形状: {df.shape}")
print(f"数据类型:\n{df.dtypes}")

# ============ 数据选择 ============
print(f"\nloc选择:\n{df.loc[0:2, ['姓名', '成绩']]}")
print(f"\niloc选择:\n{df.iloc[1:3, 0:2]}")

# ============ 过滤 ============
print(f"\n北京学生:\n{df[df['城市'] == '北京']}")
print(f"\n高分学生:\n{df[df['成绩'] >= 90]}")

# ============ 排序 ============
print(f"\n按成绩排序:\n{df.sort_values('成绩', ascending=False)}")

# ============ 统计 ============
print(f"\n描述统计:\n{df.describe()}")
print(f"\n城市分布:\n{df['城市'].value_counts()}")

# ============ apply ============
df['等级'] = df['成绩'].apply(lambda x: 'A' if x >= 90 else 'B' if x >= 80 else 'C')
print(f"\n添加等级列:\n{df}")

print("\n✅ Python验证通过 — DataFrame创建/选择/过滤")
🏆 成就解锁:DataFrame创建/选择/过滤
Python验证通过 — DataFrame创建、loc/iloc选择、条件过滤、排序、描述统计、值计数、apply函数全部正确运行。等级分类A/B/C逻辑无误。
思考题:
① loc和iloc的最大区别是什么?
② 如何选择满足多个条件的行?
③ df['A']和df[['A']]返回的类型有什么不同?
④ apply和map的区别是什么?

📝 课后练习

  1. 创建一个包含10列的DataFrame,练习各种选择方式
  2. 实现一个简单的学生成绩排名系统
  3. 用条件过滤和groupby分析鸢尾花数据
  4. 对比apply、map、applymap的用法差异
  5. 将DataFrame导出为CSV和Excel文件
📚 参考资料:
• Pandas官方文档: pandas.pydata.org/docs
• Python for Data Analysis (Wes McKinney, 2022)
• Pandas Cookbook (Ted Petrou, 2020)
• Pandas 2.x新特性: pandas.pydata.org/docs/whatsnew

🗺️ Pandas选择方法速查

Pandas数据选择决策树: 选择什么? ├ 单列 → df['列名'] 或 df.列名 ├ 多列 → df[['列1','列2']] ├ 行(位置) → df.iloc[0:5] ├ 行(条件) → df[df['列'] > 值] ├ 行列(标签) → df.loc[行, 列] ├ 行列(位置) → df.iloc[0:5, 0:3] ├ 单值(标签) → df.at[行, 列] ├ 单值(位置) → df.iat[0, 0] └ 复杂条件 → df.query('条件') 链式操作: ──────── df[df['城市']=='北京'] # 过滤 .sort_values('成绩') # 排序 .head(10) # 取前10 [['姓名','成绩']] # 选列

Pandas vs SQL对照表

操作PandasSQL
选择列df[['A','B']]SELECT A, B
过滤df[df.A > 0]WHERE A > 0
排序df.sort_values('A')ORDER BY A
分组df.groupby('A').mean()GROUP BY A
连接pd.merge(df1, df2)JOIN
去重df.drop_duplicates()DISTINCT
限制行数df.head(10)LIMIT 10
聚合df.agg({'A':'mean'})AVG(A)

🔑 本课关键要点

Pandas基础核心5条:
① DataFrame是最重要的数据结构——字典创建最直观
② loc用标签(含末端),iloc用位置(不含末端)——永远记住这个区别
③ 条件过滤用df[df['列'] > 值],多条件用&|
describe()是你对数据的第一次"体检"
apply()是最灵活的列操作——但能不用就不用(向量化更快)
# 常见操作速查
df['新列'] = df['旧列'] * 2           # 新增列
df = df.rename(columns={'旧':'新'})    # 重命名
df = df.drop(columns=['列名'])         # 删除列
df = df.drop(index=[0,1])              # 删除行
df['列'] = df['列'].astype(float)      # 类型转换
df = df.set_index('列名')              # 设置索引
df = df.reset_index()                  # 重置索引
df = df.replace({旧值: 新值})          # 值替换
Pandas读取大文件技巧:①用chunksize分块读取 ②用dtype指定类型节省内存 ③用usecols只读需要的列 ④用parse_dates直接解析日期。对于GB级数据,考虑Dask或Vaex。
Pandas常见错误:①链式赋值df[df>0]['A']=1会触发SettingWithCopyWarning ②inplace=True在新版Pandas中可能不生效 ③df.ix已废弃,用locilocdf['A']返回Series,df[['A']]返回DataFrame。