按条目组合出现次数阈值修改pandas DataFrame的字段值
实现步骤
你可以通过groupby+transform的方式高效实现需求,无需额外的表关联操作,具体代码如下:
步骤1:计算组合出现频次
用transform把每个Age+University组合的出现次数映射到原表的每一行,生成临时计数列:
import pandas as pd # 测试数据集 details = { 'Name' : ['Sharon', 'Aisha', 'Shaurya', 'Shahul', 'Rhonda', 'Latifa', 'Raja', 'Mia'], 'Age' : [23, 21, 22, 21, 30, 21, 21, 23], 'University' : ['WU', 'JNU', 'DBU', 'BHU', 'JNU', 'WU', 'JNU', 'WU'], } df = pd.DataFrame(details) # 生成组合计数列 df['comb_count'] = df.groupby(['Age', 'University'])['Name'].transform('count')
步骤2:替换低频组合的University值
筛选出计数小于2的行,将对应University字段替换为Other,不需要保留计数列可以直接删除:
# 替换低频值 df.loc[df['comb_count'] < 2, 'University'] = 'Other' # 删除临时计数列 df = df.drop('comb_count', axis=1)
最终输出结果
处理后的数据如下:
Name Age University 0 Sharon 23 WU 1 Aisha 21 JNU 2 Shaurya 22 Other 3 Shahul 21 Other 4 Rhonda 30 Other 5 Latifa 21 Other 6 Raja 21 JNU 7 Mia 23 WU
替代方案(小数据量可用)
如果不想新增临时列,也可以用apply逐行判断,不过数据量超过1万行时效率远低于上面的方案:
comb_counts = df.groupby(['Age', 'University']).size() df['University'] = df.apply( lambda x: 'Other' if comb_counts.loc[(x['Age'], x['University'])] < 2 else x['University'], axis=1 )
内容的提问来源于stack exchange,提问作者Galaffer
相关产品推荐
相关产品推荐

