1. 认识 Pandas #

1.1 Pandas 是什么? #

1.2 为什么需要 Pandas? #

1.3 第一个 Pandas 示例 #

# 导入 Pandas,简写为 pd
import pandas as pd

# 用字典创建 DataFrame(键是列名,值是列数据)
df = pd.DataFrame({
    '姓名': ['小明', '小红', '小刚'],
    '数学': [85, 92, 78],
    '英语': [90, 88, 95]
})
# 打印整个表格
print(df)
# 计算数学列平均分
print("数学平均分:", df['数学'].mean())

2. 前置知识 #

2.1 表格数据是什么? #

2.2 NumPy 与缺失值 NaN #

# 导入 NumPy 和 Pandas
import numpy as np
import pandas as pd

# NaN 表示缺失
print("NaN:", np.nan)
# 创建含缺失值的 Series
s = pd.Series([1, 2, np.nan, 4])
# 检测缺失
print(s.isna())

3. 安装与环境 #

3.1 安装 Pandas #

# 安装 Pandas
pip install pandas
# 如需读写 .xlsx 文件,再装 openpyxl
pip install openpyxl
# 验证版本
python -c "import pandas as pd; print(pd.__version__)"

3.2 导入方式 #

# 导入 Pandas
import pandas as pd
# 导入 NumPy(处理 NaN、数组时常用)
import numpy as np
# 打印版本号
print("Pandas 版本:", pd.__version__)

4. Series 入门 #

4.1 创建 Series #

# 导入 Pandas
import pandas as pd

# 从列表创建(默认整数索引)
scores = pd.Series([88, 92, 85, 96])
# 打印 Series
print(scores)

# 自定义索引(标签)
named = pd.Series([88, 92, 85], index=['张三', '李四', '王五'])
# 打印带名字索引的 Series
print(named)

4.2 索引与常用统计 #

# 导入 Pandas
import pandas as pd

# 创建 Series
sales = pd.Series([1200, 1500, 1800, 2100], index=['Q1', 'Q2', 'Q3', 'Q4'])
# 取 Q2 的值
print("Q2:", sales['Q2'])
# 总和
print("总和:", sales.sum())
# 均值
print("均值:", sales.mean())
# 统计摘要
print(sales.describe())

5. DataFrame 入门 #

5.1 创建 DataFrame #

# 导入 Pandas
import pandas as pd

# 字典创建:每列长度必须相同
df = pd.DataFrame({
    '产品': ['手机', '电脑', '平板'],
    '销量': [120, 85, 150],
    '单价': [2999, 5999, 2499]
})
# 打印表格
print(df)

5.2 查看数据概况 #

# 导入 Pandas
import pandas as pd

# 示例数据
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [20, 21, 19, 22],
    '成绩': [85.5, 92.0, 78.5, 88.0]
})
# 前 2 行
print("head:\n", df.head(2))
# 行数列数
print("shape:", df.shape)
# 列类型与非空计数
print("info:")
df.info()
# 数值列统计
print("describe:\n", df.describe())

5.3 选取列与单列运算 #

# 导入 Pandas
import pandas as pd

df = pd.DataFrame({
    '产品': ['手机', '电脑', '平板'],
    '销量': [120, 85, 150],
    '单价': [2999, 5999, 2499]
})
# 取销量列
print("销量列:\n", df['销量'])
# 新增销售额列
df['销售额'] = df['销量'] * df['单价']
# 打印结果
print(df)

6. 选取行:loc 与 iloc #

6.1 loc 按标签选取 #

# 导入 Pandas
import pandas as pd

df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五'],
    '年龄': [20, 21, 19],
    '成绩': [85.5, 92.0, 78.5]
})

# label  姓名 年龄  成绩
#   0    张三  20   85.5
#   1    李四  21   92.0
#   2    王五  19   78.5

# 第 2 行(标签 1)
print("第 2 行:\n", df.loc[1])
# 第 1 行第 1 列
print("单元格:", df.loc[0, '姓名'])
# 多行多列
print("子表:\n", df.loc[0:1, ['姓名', '成绩']])

6.2 iloc 按位置选取 #

# 导入 Pandas
import pandas as pd

df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [20, 21, 19, 22],
    '成绩': [85.5, 92.0, 78.5, 88.0]
})
# index  姓名 年龄  成绩
#   0    张三  20   85.5
#   1    李四  21   92.0
#   2    王五  19   78.5
#   3    赵六  22   88.0
# 第 2 行(位置 1)
print("iloc 第 2 行:\n", df.iloc[1])
# 第 2~3 行(位置 1、2)
print("行切片:\n", df.iloc[1:3])
# 第 2、3 列(位置 1、2)
print("列切片:\n", df.iloc[:, 1:3])

6.3 布尔条件筛选 #

# 导入 Pandas
import pandas as pd

df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六'],
    '成绩': [85.5, 92.0, 78.5, 88.0],
    '城市': ['北京', '上海', '广州', '深圳']
})
# 成绩大于 85
high = df[df['成绩'] > 85]
# 打印筛选结果
print(high)
# 成绩>=85 且 城市不是上海
filtered = df[(df['成绩'] >= 85) & (df['城市'] != '上海')]
# 打印结果
print(filtered)

7. 增删改 #

7.1 新增与修改列 #

# 导入 Pandas
import pandas as pd

df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五'],
    '成绩': [85, 92, 78]
})
# 新增等级列
df['等级'] = ['良好', '优秀', '及格']
# 成绩低于 80 的改为「待提升」
df.loc[df['成绩'] < 80, '等级'] = '待提升'
# 打印结果
print(df)

7.2 删除行与列 #

# 导入 Pandas
import pandas as pd

df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五'],
    '年龄': [20, 21, 19],
    '备注': ['', '班长', '']
})
# 删除备注列
df2 = df.drop(columns=['备注'])
# 删除第 1 行(标签 0)
df3 = df2.drop(index=[0])
# 打印结果
print(df3)

8. 读写 CSV #

8.1 写入与读取 CSV #

# 导入 Pandas
import pandas as pd

# 创建示例数据
df = pd.DataFrame({
    '城市': ['北京', '上海', '广州'],
    '人口': [2154, 2487, 1868],
    'GDP': [36102, 38701, 25019]
})
# 保存为 CSV(utf-8-sig 方便 Excel 打开中文)
df.to_csv('城市数据.csv', index=False, encoding='utf-8-sig')
# 从 CSV 读回
loaded = pd.read_csv('城市数据.csv', encoding='utf-8-sig')
# 打印读取结果
print(loaded)

8.2 常用 read_csv 参数 #

# 导入 Pandas
import pandas as pd

# 只读前两列,把 '--' 视为缺失
df = pd.read_csv(
    '城市数据.csv',
    encoding='utf-8-sig',
    usecols=['城市', '人口'],
    na_values=['--']
)
# 打印结果
print(df)
print("列名:", df.columns.tolist())

9. Excel 与 JSON #

9.1 读写 Excel #

# 导入 Pandas
import pandas as pd

# 创建数据
df = pd.DataFrame({
    '产品': ['手机', '电脑'],
    '销量': [120, 85]
})
# 写入 Excel
df.to_excel('销量.xlsx', index=False, sheet_name='Q1')
# 读回 Excel
loaded = pd.read_excel('销量.xlsx', sheet_name='Q1')
# 打印
print(loaded)

9.2 读写 JSON #

# 导入 Pandas 和 StringIO(把字符串当作文件流)
import pandas as pd
from io import StringIO

# JSON 字符串(列表里每个对象是一行)
json_str = '''
[
  {"姓名": "张三", "年龄": 20, "城市": "北京"},
  {"姓名": "李四", "年龄": 21, "城市": "上海"}
]
'''
# 用 StringIO 包装字符串,read_json 才会按 JSON 解析而不是当文件路径
df = pd.read_json(StringIO(json_str), orient='records')
# 打印
print(df)
# 导出为 JSON 文件
df.to_json('用户.json', orient='records', force_ascii=False, indent=2)

10. 数据清洗 #

10.1 缺失值处理 #

# 导入 Pandas 和 NumPy
import pandas as pd
import numpy as np

# 含缺失值的数据
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六'],
    '数学': [85, np.nan, 92, 78],
    '英语': [90, 88, np.nan, 95]
})
# 每列缺失数量
print("缺失统计:\n", df.isna().sum())
# 用列均值填充数学、英语
df['数学'] = df['数学'].fillna(df['数学'].mean())
df['英语'] = df['英语'].fillna(df['英语'].mean())
# 打印填充后
print(df)

10.2 重复值处理 #

# 导入 Pandas
import pandas as pd

df = pd.DataFrame({
    '订单号': ['A001', 'A002', 'A001', 'A003'],
    '客户': ['张三', '李四', '张三', '王五'],
    '金额': [100, 200, 100, 150]
})
# 删除完全重复的行
df_unique = df.drop_duplicates()
# 打印
print(df_unique)

10.3 类型与日期转换 #

# 导入 Pandas
import pandas as pd

df = pd.DataFrame({
    '日期': ['2024-01-15', '2024/02/20', '2024-03-10'],
    '销售额': ['1200', '1500', '1800']
})
# 销售额转整数
df['销售额'] = df['销售额'].astype(int)
# 日期格式不统一时,用 format='mixed' 让 Pandas 逐条自动识别
df['日期'] = pd.to_datetime(df['日期'], format='mixed')
# 打印类型
print(df.dtypes)
# 打印结果
print(df)

11. 排序与分组聚合 #

11.1 排序 sort_values #

# 导入 Pandas
import pandas as pd

df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六'],
    '数学': [85, 92, 78, 96],
    '英语': [90, 87, 95, 82]
})
# 按数学降序
sorted_df = df.sort_values(by='数学', ascending=False)
# 打印
print(sorted_df)

11.2 分组 groupby #

# 导入 Pandas
import pandas as pd

df = pd.DataFrame({
    '地区': ['华东', '华南', '华东', '华南', '华北'],
    '产品': ['A', 'B', 'A', 'B', 'A'],
    '销售额': [1000, 1500, 1200, 1800, 900]
})
# 按地区汇总销售额
by_region = df.groupby('地区')['销售额'].sum()
# 打印
print("各地区销售额:\n", by_region)
# 按地区+产品汇总
by_two = df.groupby(['地区', '产品'])['销售额'].sum()
# 打印
print("\n地区-产品销售额:\n", by_two)

12. 合并表格 #

12.1 concat 拼接 #

# 导入 Pandas
import pandas as pd

df1 = pd.DataFrame({'姓名': ['张三', '李四'], '年龄': [20, 21]})
df2 = pd.DataFrame({'姓名': ['王五', '赵六'], '年龄': [19, 22]})
# 纵向合并
merged = pd.concat([df1, df2], ignore_index=True)
# 打印
print(merged)

12.2 merge 关联 #

# 导入 Pandas
import pandas as pd

orders = pd.DataFrame({
    '订单号': ['O1', 'O2', 'O3'],
    '客户ID': ['C1', 'C2', 'C1'],
    '金额': [100, 200, 150]
})
customers = pd.DataFrame({
    '客户ID': ['C1', 'C2', 'C4'],
    '客户名': ['张三', '李四', '王五']
})
# 内连接:只保留两边都有的客户ID
result = pd.merge(orders, customers, on='客户ID', how='inner')
# 打印
print(result)