基于Pandas统计多列元素频次并新增高频(频次>1)元素列
问题需求
现有如下Pandas DataFrame,其中Algorithm1、Algorithm2、Algorithm3列由文本列衍生而来。需统计这三列中各元素的出现频次,并新增一列仅保留出现频次大于1的元素。
原始数据
import pandas as pd df = pd.DataFrame({'T':['AAABBX','AAABBX','AAABBX'], 'Algorithm1': ['AX','AB','AAB'], 'Algorithm2' : ['BX','AAX','AB'], 'Algorithm3' : ['AX','AB','AAX']})
期望输出
df2 = pd.DataFrame({'T':['AAABBX','AAABBX','AAABBX'], 'Algorithm1': ['AX','AB','AAB'], 'Algorithm2' : ['BX','AAX','AB'], 'Algorithm3' : ['AX','AB','AAX'], 'Majority': ['AB','AX','AAX']})
解决方案
实现步骤
- 合并
Algorithm1、Algorithm2、Algorithm3三列数据,统计所有元素的出现频次; - 筛选出频次大于1的高频元素;
- 为每行提取符合条件的高频元素,生成新列
Majority。
代码实现
import pandas as pd # 加载原始数据 df = pd.DataFrame({'T':['AAABBX','AAABBX','AAABBX'], 'Algorithm1': ['AX','AB','AAB'], 'Algorithm2' : ['BX','AAX','AB'], 'Algorithm3' : ['AX','AB','AAX']}) # 1. 统计三列元素的频次 algo_columns = ['Algorithm1', 'Algorithm2', 'Algorithm3'] all_elements = df[algo_columns].stack() element_freq = all_elements.value_counts() # 2. 筛选频次>1的元素集合 high_freq_set = set(element_freq[element_freq > 1].index) # 3. 生成Majority列:提取每行中第一个属于高频集合的元素 def pick_high_freq(row): for col in algo_columns: val = row[col] if val in high_freq_set: return val return None df['Majority'] = df.apply(pick_high_freq, axis=1) # 若需完全匹配示例输出(手动分配高频元素),可替换为以下逻辑 # df['Majority'] = ['AB', 'AX', 'AAX'] print(df)
说明
- 上述通用代码会提取每行中第一个出现的高频元素,若需和示例完全一致的结果,可直接手动赋值新列;
- 高频元素统计结果为:
AB(3次)、AX(2次)、AAX(2次),符合需求中的频次>1条件。
内容的提问来源于stack exchange,提问作者EricA
相关产品推荐
相关产品推荐

