如何在完整Pandas DataFrame上应用def定义的自定义函数
问题1 函数运行异常,加值超过100的解决方案
错误原因
df.apply(fun)默认按列遍历DataFrame,每传入一列就会执行一次fun函数fun函数内部循环遍历了所有列执行加100逻辑,示例DataFrame有2列,就会触发2次全表加100操作,导致符合条件的值累计加了200- 该逻辑本身不需要用
apply实现,直接封装循环逻辑即可,同时要避免函数内部操作全局变量
修正后代码
import pandas as pd import numpy as np # 示例数据构造 raw_data = {'age1': [23,45,21],'age2': [10,20,50]} df = pd.DataFrame(raw_data, columns = ['age1','age2']) def fun(df): l = list(df.columns) for c in l: df[c] = np.where(df[c]>45, df[c]+100, df[c]) return df df = fun(df)
问题2 函数无法应用到整个DataFrame的解决方案
错误原因
- 你指定了
axis=1,此时apply每次传入的参数x是一整行的Series对象,直接对Series执行x>=40返回的是布尔序列,无法被if语句识别(if只能接收单个布尔值) - 要作用到DataFrame的每一个元素,需要用
applymap(pandas 2.0+也可以用df.map)替换apply
修正后代码
方案1 适配逐元素处理
def f(x): if x>=40: val = x+100 else: val = x return val # 用applymap逐元素调用函数 df = df.applymap(f)
方案2 向量化实现(性能更高,适合大数据量)
无需自定义函数,直接用pandas向量化操作:
df = df.where(df < 40, df + 100)
内容的提问来源于stack exchange,提问作者vish community
相关产品推荐
相关产品推荐

