Pandas分组统计RAG值后按条件生成Overall RAG报错求助
解决Pandas分组生成Overall RAG的逻辑问题
先说说你原代码里的几个核心问题:
- 语法错误:
df['Overall RAG]少了闭合的单引号,应该写成df['Overall RAG'] - 分组逻辑错误:你按
['A','B']分组,得到的是每个ID+RAG组合的计数,但我们需要的是每个单独ID下的所有RAG计数分布,这样才能判断整体规则 - 条件逻辑矛盾:
x.B == 'A' & x.B == 'G' & x.B=='R'完全不成立——一个单元格的B值不可能同时等于三个不同的字符串 - 运算符误用:用了位运算符
&,单元素判断应该用逻辑运算符and;另外最后x.C == ''的条件毫无意义,count()返回的是数值,不可能是空字符串
正确实现步骤
我们可以分三步走:先统计每个ID的RAG计数分布,再按规则生成Overall RAG,最后合并回原数据。
步骤1:统计每个ID的RAG计数
用groupby+value_counts+unstack生成每个ID对应的R、A、G计数,缺失的类型补0:
# 按ID(列A)分组,统计各RAG类型的数量 rag_counts = df.groupby('A')['B'].value_counts().unstack(fill_value=0) # 确保R、A、G三列都存在(避免原数据缺失某类RAG导致列不存在) for rag in ['R', 'A', 'G']: if rag not in rag_counts.columns: rag_counts[rag] = 0
步骤2:按规则生成Overall RAG
用np.select实现多条件判断,比嵌套if-else更清晰易读:
import numpy as np # 定义规则对应的条件列表 conditions = [ # 规则1:R的计数≥2 rag_counts['R'] >= 2, # 规则2:A的计数≥2(放在R规则之后,因为R优先级更高) rag_counts['A'] >= 2, # 规则3:同时包含R、A、G且每个计数都是1 (rag_counts['R'] == 1) & (rag_counts['A'] == 1) & (rag_counts['G'] == 1) ] # 对应条件的结果 choices = ['R', 'A', 'A'] # 生成Overall RAG,其余情况返回'G' rag_counts['Overall RAG'] = np.select(conditions, choices, default='G')
步骤3:合并回原DataFrame
把生成的Overall RAG结果关联到原始数据中:
df = df.merge(rag_counts[['Overall RAG']], left_on='A', right_index=True, how='left')
完整测试示例
假设你的原始数据如下,运行完整代码可以验证效果:
import pandas as pd import numpy as np # 测试数据 data = { 'A': ['ID1', 'ID1', 'ID1', 'ID2', 'ID2', 'ID3', 'ID3', 'ID3', 'ID4', 'ID4'], 'B': ['R', 'R', 'G', 'A', 'A', 'R', 'A', 'G', 'G', 'A'] } df = pd.DataFrame(data) # 步骤1:统计计数 rag_counts = df.groupby('A')['B'].value_counts().unstack(fill_value=0) for rag in ['R', 'A', 'G']: if rag not in rag_counts.columns: rag_counts[rag] = 0 # 步骤2:生成Overall RAG conditions = [ rag_counts['R'] >= 2, rag_counts['A'] >= 2, (rag_counts['R'] == 1) & (rag_counts['A'] == 1) & (rag_counts['G'] == 1) ] choices = ['R', 'A', 'A'] rag_counts['Overall RAG'] = np.select(conditions, choices, default='G') # 步骤3:合并回原数据 df = df.merge(rag_counts[['Overall RAG']], left_on='A', right_index=True, how='left') print(df)
输出结果完全符合规则:
A B Overall RAG 0 ID1 R R 1 ID1 R R 2 ID1 G R 3 ID2 A A 4 ID2 A A 5 ID3 R A 6 ID3 A A 7 ID3 G A 8 ID4 G G 9 ID4 A G
内容的提问来源于stack exchange,提问作者sasi kiran
相关产品推荐
相关产品推荐

