如何在Pandas DataFrame中无需循环跨行匹配取值生成新列?
单匹配列场景解决方案
你可以先提取A=0的行建立映射,直接对目标列做映射即可,全程无行遍历,性能远高于apply方案:
# 构建C列到对应B值的映射 base_map = df[df['A'] == 0].set_index('C')['B'] # 映射生成新列 df['new_B_based_on_A_and_C'] = df['C'].map(base_map)
多匹配列通用解决方案
多列匹配的场景下用左连接实现即可,适配任意数量的匹配列,同样是纯矢量化操作无遍历:
# 提取A=0的基准子表,重命名B列为目标新列名 base_df = df[df['A'] == 0][['C', 'D', 'B']].rename(columns={'B': 'new_B_based_on_A_C_D'}) # 按匹配列左连接回原表 df = df.merge(base_df, on=['C', 'D'], how='left')
如果需要新增更多匹配列,只需要修改on参数的列表即可,比如新增E列匹配就改为on=['C', 'D', 'E']。
以上两种方案都是pandas原生优化的操作,针对大型DataFrame的执行效率比逐行apply高1~2个数量级,且代码简洁易维护。
内容的提问来源于stack exchange,提问作者cookiemonster
相关产品推荐
相关产品推荐

