You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:50:35