在Pandas DataFrame中实现3/5多数投票生成Voting列
为DataFrame添加基于行内多数投票的新列
问题背景
需要为包含int64类型元素的DataFrame创建Voting新列,规则如下:
- 对每行元素统计出现次数,若某元素出现3次及以上,则
Voting列填充该元素 - 若没有元素达到3次出现次数,则填充
-1
输入DataFrame
Column1 Column2 Column3 Column4 Column5 0 0 0 6 1 0 1 4 4 6 4 0 2 4 2 2 2 2 3 4 4 4 4 4 4 0 0 0 2 4 5 6 6 6 6 6 6 3 3 3 3 5 7 0 6 6 0 4 8 3 3 3 3 4 9 2 2 4 3 3
期望输出
Column1 Column2 Column3 Column4 Column5 Voting 0 0 0 6 1 0 0 1 4 4 6 4 0 4 2 4 2 2 2 2 2 3 4 4 4 4 4 4 4 0 0 0 2 4 0 5 6 6 6 6 6 6 6 3 3 3 3 5 3 7 0 6 6 0 4 -1 8 3 3 3 3 4 3 9 2 2 4 3 3 -1
解决方案
使用pandas的行级处理功能,结合元素频率统计实现需求,提供两种实现方式:
方式一:自定义函数实现(可读性强)
import pandas as pd # 构造输入DataFrame df = pd.DataFrame({ 'Column1': [0,4,4,4,0,6,3,0,3,2], 'Column2': [0,4,2,4,0,6,3,6,3,2], 'Column3': [6,6,2,4,0,6,3,6,3,4], 'Column4': [1,4,2,4,2,6,3,0,3,3], 'Column5': [0,0,2,4,4,6,5,4,4,3] }) def calculate_vote(row): # 统计每行各元素的出现次数 element_counts = row.value_counts() # 筛选出现次数≥3的元素 qualified_elements = element_counts[element_counts >= 3] # 返回结果:有符合条件的元素则取第一个,否则返回-1 return qualified_elements.index[0] if not qualified_elements.empty else -1 # 应用函数到每行,生成Voting列 df['Voting'] = df.apply(calculate_vote, axis=1) # 查看结果 print(df)
方式二:Lambda表达式简化写法
import pandas as pd df = pd.DataFrame({ 'Column1': [0,4,4,4,0,6,3,0,3,2], 'Column2': [0,4,2,4,0,6,3,6,3,2], 'Column3': [6,6,2,4,0,6,3,6,3,4], 'Column4': [1,4,2,4,2,6,3,0,3,3], 'Column5': [0,0,2,4,4,6,5,4,4,3] }) # 一行代码生成Voting列 df['Voting'] = df.apply( lambda row: row.mode()[0] if row.value_counts().max() >= 3 else -1, axis=1 ) print(df)
代码解释
row.value_counts():对每行元素做频率统计,返回一个Series,索引为元素值,值为对应出现次数- 筛选合格元素:通过
element_counts >=3过滤出满足多数投票条件的元素 - 结果判断:若存在合格元素则返回第一个(题目场景下每行最多一个合格元素),否则返回
-1 df.apply(..., axis=1):将处理逻辑应用到DataFrame的每一行,生成新列
内容的提问来源于stack exchange,提问作者gcicceri
相关产品推荐
相关产品推荐

