如何使用np.select根据前缀匹配填充pandas DataFrame的category字段
解决方案
方法1:直接转换已有的条件字符串列表
如果你的条件字符串是自行生成、无外部注入风险,可以直接用pd.eval批量转换:
# 假设你的条件字符串列表名为cond_str_list cond_list = [pd.eval(cond_str) for cond_str in cond_str_list] # 对应值列表取keyword_df中的category列即可 value_list = keyword_df['category'].tolist() # 计算匹配结果,仅填充空分类行 main_df['category'] = main_df['category'].fillna( pd.Series(np.select(cond_list, value_list, default=0), index=main_df.index) )
方法2(更推荐):直接生成布尔条件列表,避免字符串转换
不需要先生成字符串,直接遍历keyword_df构造条件,稳定性更高、没有执行任意代码的风险:
import pandas as pd import numpy as np cond_list = [] value_list = [] # 遍历前缀-分类映射表构造条件 for keyword, category in zip(keyword_df['keyword'], keyword_df['category']): # 仅匹配category为空、且description符合前缀的行 cond = main_df['category'].isnull() & main_df['description'].str.startswith(keyword) cond_list.append(cond) value_list.append(category) # 生成匹配结果 match_result = np.select(cond_list, value_list, default=0) # 仅填充原有category为空的行,保留原有非空值 main_df['category'] = main_df['category'].fillna(match_result)
注意事项
- 如果存在多个前缀同时匹配同一行的情况,
np.select会按条件列表的顺序返回第一个匹配的分类,有优先级需求可以提前给keyword_df按优先级排序即可。 - 如果需要忽略大小写匹配,可以将
str.startswith的前后字符串统一转为小写/大写再判断。
内容的提问来源于stack exchange,提问作者Jeremy Wu
相关产品推荐
相关产品推荐

