高级操作 #
高级操作概述 #
Pandas 提供了许多高级功能,可以帮助你更高效地处理和分析数据。
text
┌─────────────────────────────────────────────────────────────┐
│ 高级操作功能 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 函数应用 │
│ ├── apply 逐行/列应用 │
│ ├── applymap 逐元素应用 │
│ ├── map 元素映射 │
│ └── pipe 管道操作 │
│ │
│ 数据处理 │
│ ├── explode 爆炸列表 │
│ ├── cut/qcut 分箱 │
│ ├── get_dummies 独热编码 │
│ └── factorize 因子化 │
│ │
│ 样式设置 │
│ ├── Styler 样式对象 │
│ ├── format 格式化 │
│ └── background_gradient 渐变色 │
│ │
└─────────────────────────────────────────────────────────────┘
函数应用 #
apply 方法 #
python
import pandas as pd
import numpy as np
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': [10, 20, 30, 40, 50],
'C': [100, 200, 300, 400, 500]
})
# 逐列应用(默认)
print(df.apply(lambda x: x.max() - x.min()))
# A 4
# B 40
# C 400
# 逐行应用
print(df.apply(lambda x: x.sum(), axis=1))
# 0 111
# 1 222
# 2 333
# 3 444
# 4 555
# 返回 Series
def row_stats(row):
return pd.Series({
'sum': row.sum(),
'mean': row.mean(),
'max': row.max()
})
print(df.apply(row_stats, axis=1))
map 方法 #
python
# Series 元素映射
s = pd.Series(['cat', 'dog', 'bird', 'cat'])
# 字典映射
print(s.map({'cat': 'kitten', 'dog': 'puppy'}))
# 0 kitten
# 1 puppy
# 2 NaN
# 3 kitten
# 函数映射
print(s.map(str.upper))
# 0 CAT
# 1 DOG
# 2 BIRD
# 3 CAT
DataFrame.map 方法 #
python
# 逐元素应用(Pandas 2.1+)
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
print(df.map(lambda x: x * 2))
# A B
# 0 2 8
# 1 4 10
# 2 6 12
pipe 方法 #
pipe 方法允许将 DataFrame 作为参数传递给函数,支持链式操作。
python
def add_column(df, col_name, value):
df = df.copy()
df[col_name] = value
return df
def multiply_column(df, col_name, factor):
df = df.copy()
df[col_name] = df[col_name] * factor
return df
# 链式操作
result = (df
.pipe(add_column, 'D', 100)
.pipe(multiply_column, 'D', 2)
)
print(result)
数据处理 #
explode - 爆炸列表 #
python
df = pd.DataFrame({
'A': [[1, 2, 3], [4, 5], [6]],
'B': ['x', 'y', 'z']
})
# 爆炸列表列
print(df.explode('A'))
# A B
# 0 1 x
# 0 2 x
# 0 3 x
# 1 4 y
# 1 5 y
# 2 6 z
cut - 等宽分箱 #
python
df = pd.DataFrame({'age': [22, 25, 30, 35, 40, 45, 50, 55, 60]})
# 等宽分箱
df['age_group'] = pd.cut(df['age'], bins=3)
print(df['age_group'])
# 0 (21.97, 34.667]
# 1 (21.97, 34.667]
# 2 (21.97, 34.667]
# 3 (34.667, 47.333]
# ...
# 自定义分箱
df['age_group'] = pd.cut(
df['age'],
bins=[0, 30, 50, 100],
labels=['Young', 'Middle', 'Senior']
)
print(df)
qcut - 等频分箱 #
python
# 等频分箱
df['quartile'] = pd.qcut(df['age'], q=4, labels=['Q1', 'Q2', 'Q3', 'Q4'])
print(df)
get_dummies - 独热编码 #
python
df = pd.DataFrame({
'color': ['red', 'blue', 'green', 'red', 'blue']
})
# 独热编码
print(pd.get_dummies(df['color'], prefix='color'))
# color_blue color_green color_red
# 0 False False True
# 1 True False False
# 2 False True False
# 3 False False True
# 4 True False False
# 返回 int 类型
print(pd.get_dummies(df['color'], prefix='color', dtype=int))
factorize - 因子化 #
python
s = pd.Series(['a', 'b', 'a', 'c', 'b'])
# 因子化
codes, uniques = pd.factorize(s)
print(codes) # [0 1 0 2 1]
print(uniques) # Index(['a', 'b', 'c'], dtype='object')
# 排序
codes, uniques = pd.factorize(s, sort=True)
print(codes) # [0 1 0 2 1]
print(uniques) # Index(['a', 'b', 'c'], dtype='object')
样式设置 #
基本样式 #
python
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': [10, 20, 30, 40, 50],
'C': [100, 200, 300, 400, 500]
})
# 创建样式对象
styler = df.style
# 高亮最大值
styler = df.style.highlight_max(color='yellow')
# 高亮最小值
styler = df.style.highlight_min(color='lightblue')
# 高亮空值
df_na = pd.DataFrame({'A': [1, None, 3], 'B': [None, 2, 3]})
styler = df_na.style.highlight_null(null_color='red')
条件格式 #
python
# 背景渐变
styler = df.style.background_gradient(cmap='Blues')
# 按列渐变
styler = df.style.background_gradient(subset=['A', 'B'], cmap='Greens')
# 条形图
styler = df.style.bar(subset=['A', 'B'], color='lightblue')
格式化 #
python
# 格式化数值
styler = df.style.format('{:.2f}')
# 格式化特定列
styler = df.style.format({'A': '{:.1f}', 'B': '${:.0f}'})
# 格式化百分比
df_pct = pd.DataFrame({'rate': [0.123, 0.456, 0.789]})
styler = df_pct.style.format({'rate': '{:.2%}'})
自定义样式函数 #
python
def highlight_negative(val):
if val < 0:
return 'color: red'
return ''
df = pd.DataFrame({'A': [1, -2, 3, -4, 5]})
styler = df.style.applymap(highlight_negative)
def highlight_row(row):
if row['A'] > 3:
return ['background-color: yellow'] * len(row)
return [''] * len(row)
styler = df.style.apply(highlight_row, axis=1)
组合样式 #
python
styler = (df.style
.highlight_max(color='yellow')
.highlight_min(color='lightblue')
.format('{:.2f}')
.set_caption('My Styled DataFrame')
)
# 显示样式
styler
其他高级功能 #
where 和 mask #
python
df = pd.DataFrame({'A': [1, 2, 3, 4, 5]})
# where - 保留满足条件的值
print(df.where(df['A'] > 2, 0))
# A
# 0 0
# 1 0
# 2 3
# 3 4
# 4 5
# mask - 保留不满足条件的值
print(df.mask(df['A'] > 2, 0))
# A
# 0 1
# 1 2
# 2 0
# 3 0
# 4 0
clip - 裁剪 #
python
df = pd.DataFrame({'A': [1, 5, 10, 15, 20]})
# 裁剪到指定范围
print(df.clip(lower=5, upper=15))
# A
# 0 5
# 1 5
# 2 10
# 3 15
# 4 15
rank - 排名 #
python
df = pd.DataFrame({'A': [1, 2, 2, 3, 4]})
# 默认排名(平均)
print(df['A'].rank())
# 0 1.0
# 1 2.5
# 2 2.5
# 3 4.0
# 4 5.0
# 不同排名方法
print(df['A'].rank(method='first')) # 按出现顺序
print(df['A'].rank(method='min')) # 最小排名
print(df['A'].rank(method='max')) # 最大排名
print(df['A'].rank(method='dense')) # 紧凑排名
diff 和 pct_change #
python
df = pd.DataFrame({'A': [1, 2, 4, 7, 11]})
# 差分
print(df['A'].diff())
# 0 NaN
# 1 1.0
# 2 2.0
# 3 3.0
# 4 4.0
# 百分比变化
print(df['A'].pct_change())
# 0 NaN
# 1 1.000000
# 2 1.000000
# 3 0.750000
# 4 0.571429
cumsum, cumprod, cummax, cummin #
python
df = pd.DataFrame({'A': [1, 2, 3, 4, 5]})
# 累计求和
print(df['A'].cumsum())
# 0 1
# 1 3
# 2 6
# 3 10
# 4 15
# 累计乘积
print(df['A'].cumprod())
# 累计最大值
print(df['A'].cummax())
# 累计最小值
print(df['A'].cummin())
下一步 #
掌握了高级操作后,接下来学习 数据分析实战,通过实际案例巩固所学知识!
最后更新:2026-04-04