Pandas:如何将行内多值传入函数并根据结果替换指定值
问题:如何将DataFrame行内多个字段值传入apply函数?
场景还原
原本处理单个字段时,能正常将行内单个值传入函数并更新结果:
m = df["value_a"].isin(a_list) df.loc[m, "value_b"] = df.loc[m, "value_a"].apply(lambda x: get_new_value_b(arg1, x))
但尝试传入多个字段时,函数接收到的是整列数据而非单行的两个值:
df.loc[m, "value_b"] = df.loc[m, ["value_a", "value_c"]].apply(lambda x: get_new_value_b(arg1, x)) ... def get_new_value_b(arg1, x): print("x: {x}".format(x=x)) ... # 输出示例(x是整列的Series,不是单行值) # x: # 0 ... # 1 ... # ... # Name: value_a, dtype: object
解决方案
问题出在apply的默认参数axis=0(按列处理),只需将其改为axis=1即可按行处理,从而获取单行的多个字段值。
方式一:直接传递单个字段值
修改apply调用并调整函数参数:
# 调用时指定axis=1,lambda接收行对象,提取对应字段传入函数 df.loc[m, "value_b"] = df.loc[m, ["value_a", "value_c"]].apply(lambda row: get_new_value_b(arg1, row["value_a"], row["value_c"]), axis=1) # 对应调整函数,接收两个字段参数 def get_new_value_b(arg1, val_a, val_c): print(f"val_a: {val_a}, val_c: {val_c}") # 编写基于val_a和val_c计算新value_b的逻辑 return calculated_value
方式二:传递整行对象
如果需要用到更多字段,也可以直接把行对象传入函数,在函数内提取所需值:
# 调用时传递整行对象 df.loc[m, "value_b"] = df.loc[m, ["value_a", "value_c"]].apply(lambda row: get_new_value_b(arg1, row), axis=1) # 函数内提取字段值 def get_new_value_b(arg1, row): val_a = row["value_a"] val_c = row["value_c"] print(f"val_a: {val_a}, val_c: {val_c}") # 计算逻辑 return calculated_value
原理说明
apply默认axis=0时,会遍历每一列,将列作为Series传入函数;设置axis=1后,会遍历每一行,将行作为Series传入函数,此时就能获取到该行的value_a和value_c的单个值了。
内容的提问来源于stack exchange,提问作者Ooto
相关产品推荐
相关产品推荐

