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

Pandas中结合apply与product实现值组合频率计算

识别DataFrame中值的最常见/最不常见组合

问题背景

你有一个从电子表格生成的字符串型DataFrame,示例数据如下:

#             age sex   employed          educ marital   race
0    1  35 to 44 years   F  Full time      Some Col     DIV  White
1    2  65 to 74 years   M    Retired         BA/BS    SING  White
2    3  45 to 54 years   F  Full time         BA/BS     MAR   Hisp

你的思路是:计算各列值的频率比例,将单条记录各值的比例相乘(稀有组合的乘积会很小),以此识别最常见/最不常见的组合。

你已经构建了存储各列值频率的字典:

frequencies = {col_name: frame[col_name].value_counts(normalize=True).to_dict() for col_name in columns[1:]}

字典示例输出:'sex': {'F': 0.5666666666666667, 'M': 0.43333333333333335}

现在需要构造频率查找函数,结合apply()和product()实现需求。

解决方案

1. 构造组合频率计算函数

使用math.prod()计算单条记录各值频率的乘积,函数如下:

import math

def get_combination_product(row):
    # 遍历当前行的目标列(排除第一列的#)
    freq_list = []
    for col in row.index[1:]:
        # 从频率字典中取出当前列对应值的频率
        freq_list.append(frequencies[col][row[col]])
    # 返回频率乘积
    return math.prod(freq_list)

2. 应用函数到DataFrame

通过apply()将函数作用于每一行,生成存储乘积的新列:

# 添加新列存储组合频率乘积
frame['combination_product'] = frame.apply(get_combination_product, axis=1)

如果你喜欢更简洁的写法,也可以用lambda表达式:

frame['combination_product'] = frame.apply(
    lambda row: math.prod([frequencies[col][row[col]] for col in row.index[1:]]),
    axis=1
)

3. 筛选最常见/最不常见组合

根据新列排序,即可找到目标组合:

# 最常见组合(乘积最大,降序取第一条)
most_common_comb = frame.sort_values('combination_product', ascending=False).head(1)

# 最不常见组合(乘积最小,升序取第一条)
least_common_comb = frame.sort_values('combination_product', ascending=True).head(1)

注意事项

  • 确保frequencies字典包含所有需要计算的列(即columns[1:]与DataFrame的目标列完全匹配)
  • 如果DataFrame存在缺失值,需要提前处理(比如填充默认值或过滤缺失行),否则会因找不到对应频率报错

内容的提问来源于stack exchange,提问作者AutomaticStatic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:46:01