Python实现:根据DataFrame列值重复次数生成新列
问题描述
需要为包含多行数据的DataFrame新增一列,规则如下:
- 所有5列值相同时,新列值为5
- 至少4个列值相同时为4
- 至少3个列值相同时为3
- 至少2个列值相同时为2
- 所有列值均不同时为0
示例输入数据:
p1 p2 p3 p4 p5 0 1 1 1 1 1 1 2 3 2 2 2 2 2 2 3 4 1 3 4 4 1 1 1 4 2 1 2 3 5 5 1 2 3 4 5
预期输出:
p1 p2 p3 p4 p5 new 0 1 1 1 1 1 5 1 2 3 2 2 2 4 2 2 2 3 4 1 2 3 4 4 1 1 1 3 4 2 1 2 3 5 2 5 1 2 3 4 5 0
当前仅实现了全相同的情况:
import numpy as np df['new'] = np.where((df['p1'] == df['p2']) & (df['p1'] == df['p3']) & (df['p1'] == df['p4']) & (df['p1'] == df['p5']), 5, 0)
解决方案
方法1:apply结合value_counts(直观易读)
适合数据量较小的场景,逐行统计每个值的出现次数,取最大值后映射到规则:
import pandas as pd import numpy as np # 构造示例DataFrame data = { 'p1': [1, 2, 2, 4, 2, 1], 'p2': [1, 3, 2, 4, 1, 2], 'p3': [1, 2, 3, 1, 2, 3], 'p4': [1, 2, 4, 1, 3, 4], 'p5': [1, 2, 1, 1, 5, 5] } df = pd.DataFrame(data) def calculate_new_col(row): # 获取当前行各值的出现次数,取最大值 max_repeat = row.value_counts().max() # 按规则返回:出现次数≥2则返回次数,否则返回0 return max_repeat if max_repeat >= 2 else 0 df['new'] = df.apply(calculate_new_col, axis=1) print(df)
方法2:向量化实现(高效处理大数据)
避免逐行循环,用向量化操作提升性能:
# 计算每行每个元素对应的出现次数 count_matrix = df.apply(lambda x: x.map(x.value_counts()), axis=1) # 取每行的最大出现次数 max_counts = count_matrix.max(axis=1) # 将出现次数为1的情况替换为0,其余保留原次数 df['new'] = np.where(max_counts == 1, 0, max_counts)
更简洁的写法:
df['new'] = df.apply(lambda row: row.value_counts().max(), axis=1).replace(1, 0)
方法3:利用scipy.stats.mode统计众数次数
通过众数的出现次数直接映射规则:
from scipy.stats import mode # 计算每行众数的出现次数,flatten转为一维数组 mode_counts = mode(df, axis=1)[1].flatten() # 映射规则:次数为1则为0,否则为次数本身 df['new'] = np.where(mode_counts == 1, 0, mode_counts)
内容的提问来源于stack exchange,提问作者123mcgr
相关产品推荐
相关产品推荐

