pandas apply应用

一、基本用法

1. 语法

复制
# 对 DataFrame 使用 apply
DataFrame.apply(func, axis=0)  # axis=0 按列处理,axis=1 按行处理

# 对 Series 使用 apply
Series.apply(func)

2. 核心参数

func: 要应用的函数(可以是内置函数、lambda、自定义函数)

axis:

axis=0(默认):按列处理(每次传入一列)

axis=1:按行处理(每次传入一行)

args: 向函数传递额外参数的元组

result_type: 控制返回类型(仅对 DataFrame 有效)

二、实际案例

示例数据

import pandas as pd

data = {
    '姓名': ['张三', '李四', '王五'],
    '数学': [85, 92, 78],
    '语文': [88, 90, 85]
}
df = pd.DataFrame(data)

案例1:对列操作(Series)

# 将数学成绩统一加5分
df['数学'] = df['数学'].apply(lambda x: x + 5)

案例2:对行操作(DataFrame)

# 计算每个人的总分(按行处理)
df['总分'] = df.apply(lambda row: row['数学'] + row['语文'], axis=1)

案例3:自定义函数

# 定义成绩等级函数
def get_grade(score):
    if score >= 90:
        return 'A'
    elif score >= 80:
        return 'B'
    else:
        return 'C'

# 应用函数到数学列
df['数学等级'] = df['数学'].apply(get_grade)

案例4:传递额外参数

def adjust_score(score, adjustment):
    return score + adjustment

# 将语文成绩统一加3分
df['语文'] = df['语文'].apply(adjust_score, args=(3,))

三、性能建议

  1. 优先使用向量化操作
    能用 df[‘列’] * 2 就不要用 apply(快 100-1000 倍)

  2. 复杂逻辑才用 apply
    例如涉及多列判断、字符串处理、外部 API 调用等情况

  3. 设置 axis 方向时注意性能
    按行处理(axis=1)通常比按列处理慢,axis=1 的行操作本质是 Python 循环,速度极慢

四、进阶案例

  1. 返回多列结果
def process_row(row):
    return pd.Series({
        '总分': row.sum(),
        '平均分': row.mean()
    })

new_df = df[['数学', '语文']].apply(process_row, axis=1)
  1. 结合条件判断
df['评价'] = df.apply(
    lambda x: '优秀' if x['总分'] > 180 else '合格', 
    axis=1
)
  1. 处理缺失值
df.apply(lambda x: x.fillna(x.mean()), axis=0)

五、何时必须用 apply?

以下场景仍需使用 apply:

  1. 涉及多列的逻辑判断
df.apply(lambda row: row['数学'] + row['语文'] if row['姓名'] != '张三' else 0, axis=1)
  1. 调用外部函数/API
df['地址'] = df['经纬度'].apply(get_address_from_api)

你可能感兴趣的:(pandas)