如何在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
相关产品推荐
相关产品推荐

