高级操作 #

高级操作概述 #

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