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
相关产品推荐
相关产品推荐

