Python pandas apply自定义函数教程
用apply、applymap、map给DataFrame逐行逐列跑自定义逻辑,结合lambda和多分支判断,处理复杂业务规则比向量化表达式更直观。
场景痛点
pandas内置函数能解决80%的问题,但剩下20%业务规则比如"满1万打9折、满5万打8折、还要区分新老客户",写成向量化表达式又长又难读。用apply把逻辑写成普通Python函数,逐行跑一遍,可读性好,调试也方便。
用到的库
pip install pandas
完整代码
import pandas as pd
def sample_df():
return pd.DataFrame({
"customer": ["新客户", "老客户", "新客户", "老客户"],
"amount": [8000, 60000, 12000, 3000],
"level": ["普通", "VIP", "普通", "VIP"],
})
def calc_discount(row):
"""逐行计算折扣:业务规则复杂时用apply最清晰"""
amount = row["amount"]
if row["customer"] == "老客户" and row["level"] == "VIP":
return amount * 0.8
if amount >= 50000:
return amount * 0.85
if amount >= 10000:
return amount * 0.9
return amount
def apply_demo():
df = sample_df()
# 1. 逐行应用函数,axis=1
df["final_amount"] = df.apply(calc_discount, axis=1)
# 2. 用lambda简化简单逻辑
df["tag"] = df["amount"].apply(lambda x: "大额" if x >= 10000 else "小额")
# 3. 多列输入:函数接收整个row,可同时读多列
df["level_tag"] = df.apply(
lambda r: f"{r['customer']}-{r['level']}", axis=1
)
print(df)
return df
if __name__ == "__main__":
apply_demo()
代码讲解
df.apply(func, axis=1)逐行调用func,func接收一行(Series),返回一个值,结果拼成新列。axis=0是逐列。df["col"].apply(func)只对这一列逐元素调用,最常用,比df.apply性能好。- lambda适合一两行逻辑,复杂规则单独def一个函数,可读性高很多。
- apply内部拿到的row是Series,可以
row["字段名"]访问任意列,做多字段联动计算很方便。
运行结果
控制台打印处理后的DataFrame:final_amount按折扣规则计算,tag按金额大小分大小额,level_tag把客户类型和等级拼起来。例如老客户VIP且60000元,final_amount=48000。
注意事项
- apply本质是Python级别的for循环,十万行以上会慢,能用向量化(如
np.where、pd.cut)就别用apply。 - apply里不要做IO(读写文件、调网络),每一行都触发一次IO会慢到怀疑人生。
- 函数里如果要用到外部变量,用闭包或functools.partial传参,避免全局变量副作用。
- 调试时先把函数单独在一行上跑通,再apply到整列,别直接apply后看报错。

更新时间:2026-09-14 20:58:19
上一篇:Python pandas数据类型转换astype详解