如何在Pandas中为标签匹配出现次数最多的字母并添加预测列?
解决方案
首先创建示例DataFrame:
import pandas as pd df = pd.DataFrame({ 'letter': ['a', 'b', 'c', 'a', 'a', 'c', 'b', 'a'], 'label': [3, 2, 3, 1, 1, 3, 2, 5] })
步骤1:统计标签与字母组合的出现频次
先按label和letter分组,统计每组的出现次数:
counts = df.groupby(['label', 'letter']).size().reset_index(name='count')
得到的频次表如下:
| label | letter | count |
|---|---|---|
| 1 | a | 2 |
| 2 | b | 2 |
| 3 | a | 1 |
| 3 | c | 2 |
| 5 | a | 1 |
步骤2:构建标签到高频字母的映射
对每个label,筛选出出现次数最多的letter,并转为字典映射:
label_to_top_letter = counts.groupby('label').apply( lambda x: x.loc[x['count'].idxmax(), 'letter'] ).to_dict()
生成的映射字典为:{1: 'a', 2: 'b', 3: 'c', 5: 'a'}
步骤3:生成目标列
通过map函数将每个label对应的高频字母赋值给新列label_pred:
df['label_pred'] = df['label'].map(label_to_top_letter)
最终得到的结果与需求一致:
letter label label_pred 0 a 3 c 1 b 2 b 2 c 3 c 3 a 1 a 4 a 1 a 5 c 3 c 6 b 2 b 7 a 5 a
原代码错误原因
你之前使用的df.groupby(["letter", "label"]).count().max()逻辑偏差:
- 按
letter和label组合分组后,count()统计的是每组的行数,但后续的max()是取所有计数中的最大值(此处为2),得到的是一个单值结果,无法与原DataFrame的每行对应,因此赋值后会得到空列或全为同一值的列,完全不符合需求。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

