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

如何统一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:39:40