You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python Pandas DataFrame中按条件拼接两列

问题描述

我有如下DataFrame:

d = {'col1': [1, "Avoid", 3, "Avoid"], 'col2': ["AA", "BB", "Avoid", "Avoid"]}
df = pd.DataFrame(data=d)
df

对应的输出为:

col1    col2
0   1       AA
1   Avoid   BB
2   3       Avoid
3   Avoid   Avoid

需要按以下规则将col1和col2拼接为新列col3:

  • 仅当两列值均不为"Avoid"时执行拼接;
  • 只要col1或col2任意一列为"Avoid",col3就设为"Avoid";
  • 拼接时在两值之间添加" & ",例如第一行的col3应为"1 & AA"。

期望结果如下:

col1    col2    col3
0   1       AA      1 & AA
1   Avoid   BB      Avoid
2   3       Avoid   Avoid
3   Avoid   Avoid   Avoid

请问如何不使用for循环实现该需求?


解决方案

可以利用Pandas和NumPy的向量化操作来实现,这类操作比循环高效得多,适合处理任意规模的数据集。

方法一:使用numpy.where

先定义判断条件,再根据条件选择拼接结果或"Avoid":

import numpy as np
import pandas as pd

d = {'col1': [1, "Avoid", 3, "Avoid"], 'col2': ["AA", "BB", "Avoid", "Avoid"]}
df = pd.DataFrame(data=d)

# 定义两列都不为"Avoid"的条件
valid_condition = (df['col1'] != "Avoid") & (df['col2'] != "Avoid")

# 生成col3:满足条件则拼接,否则设为"Avoid"
# 注意col1包含数值类型,需要先转为字符串才能拼接
df['col3'] = np.where(
    valid_condition,
    df['col1'].astype(str) + " & " + df['col2'],
    "Avoid"
)

print(df)

方法二:使用Series.mask

先生成所有拼接结果,再用mask将不满足条件的行替换为"Avoid",写法更简洁:

import pandas as pd

d = {'col1': [1, "Avoid", 3, "Avoid"], 'col2': ["AA", "BB", "Avoid", "Avoid"]}
df = pd.DataFrame(data=d)

valid_condition = (df['col1'] != "Avoid") & (df['col2'] != "Avoid")

# 先拼接所有行,再把不符合条件的替换为"Avoid"
df['col3'] = (df['col1'].astype(str) + " & " + df['col2']).mask(~valid_condition, "Avoid")

print(df)

两种方法都能得到你期望的结果,且全程没有使用循环,完全依赖向量化运算,执行效率远高于循环遍历。


内容的提问来源于stack exchange,提问作者edn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:21:28