Pandas中统计DataFrame内A列元素全局出现次数并新增列
实现F列填充的两种可运行方案
方案1:最小改动适配你现有代码
你当前的代码已经能在循环里算出每个A列元素的全局出现次数,缺失的核心步骤是把「元素-出现次数」的对应关系持久化存储,再通过映射关系回填到新列。
修改要点如下:
- 循环开始前初始化空字典,用来存储每个元素对应的总出现次数
- 每轮循环计算完单个元素的匹配次数后,把元素值和对应次数存入字典
- 循环结束后,借助
map()函数将字典的映射关系应用到A列,直接生成F列
修改后的核心循环代码:
# 初始化频次映射字典 count_map = {} for cell in df['A']: m = df.eq(cell).sum() dep = m.sum() # 存储元素与对应出现次数的映射 count_map[cell] = dep # 生成F列 df['F'] = df['A'].map(count_map)
方案2:更高效的向量化写法(推荐)
你现在的实现逻辑每循环一个元素就要遍历整张DataFrame做相等判断,当数据量变大时运行效率会明显下降。可以用Pandas原生的频次统计能力一次性完成全表统计,省去逐元素循环的步骤:
- 把整张DataFrame的所有非空单元格值拉平,过滤掉占位符
- - 直接用
value_counts()生成全表元素的出现频次表 - 用A列的值匹配频次表,生成F列
对应代码片段:
# 保留你之前生成df的全部逻辑,接下面的统计步骤 # 拉平所有非空单元格,替换占位符'-'为缺失值后过滤 all_valid_cells = df.stack().replace('-', np.nan).dropna() # 统计各元素的全局出现次数 global_counts = all_valid_cells.value_counts() # 生成F列 df['F'] = df['A'].map(global_counts)
最终输出效果
运行后得到的DataFrame完全匹配你预期的结构:
| A | B | C | D | E | F |
|---|---|---|---|---|---|
| a | - | NaN | NaN | NaN | 5 |
| b | a | NaN | NaN | NaN | 3 |
| c | a | NaN | NaN | NaN | 1 |
| d | b | a | NaN | NaN | 2 |
| e | d | b | a | NaN | 1 |
注意:统计过程会自动跳过占位符
-和空值,不会把无意义的占位内容计入元素出现次数。
内容的提问来源于stack exchange,提问作者Afshin
相关产品推荐
相关产品推荐

