Pandas中如何用单个def函数返回两值分别赋值给两列?
解答
完全可以通过单个自定义函数实现同时返回两个值、填充DataFrame两列的需求,不需要编写两个逻辑高度重复的函数。
单函数实现方式
使用apply(axis=1)逐行处理数据时,只要让函数返回长度与目标列数一致的可迭代对象(元组、列表均可),配合result_type='expand'参数,pandas就会自动将返回值拆分为独立列,直接完成多列赋值。
匹配你原有逻辑的代码如下:
def code_process(row): code_val = row['Code'] concordance_val = row['Concordance'] if pd.isna(concordance_val): # 返回值顺序需和等号左侧的列顺序一一对应:第一个给Acronyme,第二个给Concordance return (None, None) return (concordance_val, code_val) # 一次性完成两列赋值 ListeCodeNova[['Acronyme', 'Concordance']] = ListeCodeNova.apply(code_process, axis=1, result_type='expand')
这段代码的运行结果和你原本写两个独立函数的效果完全一致。
更高效的替代方案
如果你的数据集体量较大,逐行apply的运行效率很低。你的判断逻辑非常简单,完全可以用pandas原生向量化操作实现,不需要自定义函数,运行速度会有量级提升:
import numpy as np # 标记Concordance为空值的行 na_mask = ListeCodeNova['Concordance'].isna() # 按规则批量赋值 ListeCodeNova['Acronyme'] = np.where(na_mask, None, ListeCodeNova['Concordance']) ListeCodeNova['Concordance'] = np.where(na_mask, None, ListeCodeNova['Code'])
内容的提问来源于stack exchange,提问作者Rocheteau
相关产品推荐
相关产品推荐

