DataFrame新增列的函数实现方案及各方法优劣解析
Pandas DataFrame新增列的三种函数实现方式对比
咱们先看基础的DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'a': [3, 5, 7, 9], 'b': [4, 12, 24, 40] })
下面是三种用独立函数新增列的实现思路,咱们逐个分析优缺点:
方式1:使用apply()创建Series作为新列添加
def method1(row): return np.sqrt(row['a']**2 + row['b']**2) # 主程序调用 df['c'] = df.apply(method1, axis=1)
优缺点:
- 优点:
- 调用代码的签名非常清晰,一眼就能看出是在给DataFrame新增
'c'列,可读性拉满; - 支持并行处理,配合相关配置或工具可以在大数据量场景下提升效率。
- 调用代码的签名非常清晰,一眼就能看出是在给DataFrame新增
- 缺点:
- 函数只能返回单个值,没法一次性生成多列,要加多个列就得写多个函数或者多次调用
apply(),不够灵活。
- 函数只能返回单个值,没法一次性生成多列,要加多个列就得写多个函数或者多次调用
方式2:将整个DataFrame传入函数进行原地修改
def method2(df): df['c'] = np.sqrt(df['a']**2 + df['b']**2) # 主程序调用 method2(df)
优缺点:
- 优点:
- 代码量最少,写法最简洁;
- 能避免
apply()的小坑——apply(axis=1)第一次执行时会偷偷跑一遍第一行做类型推断,这个小问题在依赖行状态的函数里可能引发异常,这种方式就没这个顾虑。
- 缺点:
- 不符合Pandas的惯用风格,原地修改的操作没有在主程序里显式体现,别人看主程序代码时,不打开
method2根本不知道它修改了原DataFrame; - 无法做并行处理,因为是直接操作整个DataFrame,没法拆分任务。
- 不符合Pandas的惯用风格,原地修改的操作没有在主程序里显式体现,别人看主程序代码时,不打开
方式3:通过apply()扩展行并重构DataFrame
def method3(row): row['c'] = np.sqrt(row['a']**2 + row['b']**2) return row # 主程序调用 df = df.apply(method3, axis=1)
优缺点:
- 优点:
- 单个函数就能一次性新增多列,只要在函数里给
row添加多个字段即可,灵活性很高; - 同样支持并行处理,适合大数据量场景的优化。
- 单个函数就能一次性新增多列,只要在函数里给
- 缺点:
- 调用代码的可读性很差,光看
df = df.apply(method3, axis=1)完全猜不到是在新增列,得看函数内部才明白; - 性能表现不佳——
apply(axis=1)是逐行处理数据,比Pandas原生的向量化操作慢很多,数据量越大,这个性能差距越明显。
- 调用代码的可读性很差,光看
内容的提问来源于stack exchange,提问作者Aniket A.
相关产品推荐
相关产品推荐

