如何将DataFrame某列Top15高频值匹配赋值至新增列
问题根因说明
你之前尝试的两种写法存在核心逻辑偏差:df['job'].value_counts()[14::-1] 返回的是以job列唯一值为索引、对应值为频次计数的Series,这个Series的索引和原DataFrame的行索引完全无匹配关系,且长度远短于原DataFrame的总行数。直接赋值时pandas会自动按索引做对齐匹配,绝大多数位置都会填充缺失值,无法实现逐行判断的效果。
正确实现步骤
第一步:提取job列频次Top15的目标值
先通过计数排序拿到排名前15的高频job值,存为可用于逐行匹配的索引序列:
# value_counts()默认按频次从高到低排序,nlargest(15)直接取前15个高频值 top15_job_values = df['job'].value_counts().nlargest(15).index
第二步:生成目标新列
逐行判断当前行的job值是否在Top15集合内,匹配则保留原job值,不匹配则标注为Null,有两种常用实现方式:
写法1:用where快速实现
# isin()生成与原DataFrame等长的逐行匹配布尔序列 # where()在布尔值为True的位置保留原job列值,False位置替换为指定标注值 # 这里设置other为"Null",即可得到与示例一致的字符串标注效果 df['job15'] = df['job'].where(df['job'].isin(top15_job_values), other="Null")
写法2:用loc索引分步实现(逻辑更直观)
# 先将新列全部初始化为目标标注值 df['job15'] = "Null" # 生成匹配掩码 match_mask = df['job'].isin(top15_job_values) # 给匹配到Top15的行赋值对应的原job值 df.loc[match_mask, 'job15'] = df.loc[match_mask, 'job']
效果验证
对应你给出的示例数据,如果取频次Top2(即出现2次的Marketing、Sales),运行后输出结果会与预期结构完全一致:
Col0 Col1 Col2 job job15 11 02 ahn Marketing Marketing 22 05 ghdf Sales Sales 58 058 syg Sales Sales 68 085 sdhj Finance Null 86 088 sgx Marketing Marketing 55 08 dyy IT Null
内容的提问来源于stack exchange,提问作者SMO
相关产品推荐
相关产品推荐

