Pandas中基于列表和另一列条件替换逗号分隔列的对应值
实现方案
首先我们先从Names列提取命中my_list的关键词,再用命中的关键词替换IDs列逗号分隔的第一个元素即可,完整可运行代码如下:
import pandas as pd import numpy as np df = pd.DataFrame({'IDs':['d,f,o','d,f','d,f,o','d,f','d,f'], 'Names':['APPLE ABCD ONE','date ABCD','NO foo YES','ORANGE AVAILABLE','TEA AVAILABLE']}) my_list = ['APPLE', 'ORANGE', 'LEMONS', 'STRAWBERRY', 'BLUEBERRY'] # 构造正则匹配规则,匹配my_list中的所有元素 match_pattern = '|'.join(my_list) # 提取每行Names中命中的关键词,无命中则返回NaN df['matched'] = df['Names'].str.extract(f'({match_pattern})', expand=False) # 按行处理替换IDs df['IDs'] = df.apply( lambda row: ','.join([row['matched']] + row['IDs'].split(',')[1:]) if pd.notna(row['matched']) else row['IDs'], axis=1 ) # 查看结果 print(df['IDs'].tolist()) # 输出:['APPLE,f,o', 'd,f', 'd,f,o', 'ORANGE,f', 'd,f']
逻辑说明
- 用
str.extract配合正则批量提取命中关键词,比循环判断any的写法效率更高,同时可以直接拿到命中的具体值,不需要额外遍历查找 - 替换逻辑:将原
IDs按逗号拆分为列表,把第一个元素替换为命中的关键词,再用逗号拼接回字符串,无命中的行直接保留原IDs值 - 如果不需要保留中间的
matched列,处理完成后可以用df.drop('matched', axis=1, inplace=True)删除
内容的提问来源于stack exchange,提问作者zara kolagar
相关产品推荐
相关产品推荐

