如何统一DataFrame中含B/BB/CCC的字符串分类标签?
解决方案
处理这类字符串分类替换的核心是匹配优先级:必须先匹配包含"BB"的字符串(避免被"B"的规则误判),再匹配包含"B"但不含"BB"的,最后匹配包含"CCC"的。以下是针对Pandas DataFrame列的具体实现:
方法一:使用np.select多条件匹配
import pandas as pd import numpy as np # 模拟目标DataFrame data = {'rating': ['BB+', 'B-', 'BB', 'BB-', 'CCC+', 'N.A.', 'CCC', 'B+', 'B', None, 'BB *-', 'B- *+', 'CC *-', 'B+ *-', 'BB- *-', 'NR', 'CCC-', 'BBB-', 'B+ *+', 'BB+ *+', 'B *+', 'BB *+', 'D', 'BB+ *-', 'CCC+ *+', 'BBB', 'C *-', 'CCC+ *-', 'BB- *+', 'CCC *+', 'FLD UNKNO', '(P)CCC+', '(P)B+', 'C', 'CCC- *-', 'BBB- *-']} df = pd.DataFrame(data) # 定义匹配条件与对应替换值 conditions = [ df['rating'].str.contains('BB', na=False), # 匹配含BB的所有字符串 df['rating'].str.contains('B', na=False) & ~df['rating'].str.contains('BB', na=False), # 匹配含B但不含BB的字符串 df['rating'].str.contains('CCC', na=False) # 匹配含CCC的所有字符串 ] choices = ['BB', 'B', 'CCC'] # 执行替换,未匹配的数值保持原样 df['cleaned_rating'] = np.select(conditions, choices, default=df['rating'])
方法二:链式mask分步替换
如果偏好分步处理逻辑,可使用mask逐个替换:
df['cleaned_rating'] = df['rating'].copy() # 第一步:替换所有含BB的变体 df['cleaned_rating'] = df['cleaned_rating'].mask(df['cleaned_rating'].str.contains('BB', na=False), 'BB') # 第二步:替换含B但未被替换为BB的变体 df['cleaned_rating'] = df['cleaned_rating'].mask( df['cleaned_rating'].str.contains('B', na=False) & (df['cleaned_rating'] != 'BB'), 'B' ) # 第三步:替换所有含CCC的变体 df['cleaned_rating'] = df['cleaned_rating'].mask(df['cleaned_rating'].str.contains('CCC', na=False), 'CCC')
转换效果验证
处理后目标字符串的转换结果符合预期:
- 含BB的变体(如
BB+、BB- *+、BBB-)统一转为BB - 含B但不含BB的变体(如
B- *+、(P)B+、B *+)统一转为B - 含CCC的变体(如
CCC+ *-、(P)CCC+、CCC- *-)统一转为CCC - 非目标字符串(如
N.A.、CC *-、None)保持原始值不变
内容的提问来源于stack exchange,提问作者bmccubbin
相关产品推荐
相关产品推荐

