Python DataFrame统计两列所有唯一值分别在两列的出现次数
实现方案(基于Pandas)
完整可运行代码
import pandas as pd # 构造测试数据,你可以替换为自己的实际DataFrame df = pd.DataFrame({ 'ID': [1,2,3,4,5,6,7,8], 'Expected': ['A','A','C','B','C','A','B','A'], 'Actual': ['B','A','B','D','D','A','B','D'] }) # 方法1:双列统计直接合并(适合仅2列统计的场景) exp_count = df['Expected'].value_counts() act_count = df['Actual'].value_counts() # 合并结果、补0、格式调整 result = pd.concat([exp_count, act_count], axis=1)\ .fillna(0)\ .astype(int)\ .rename_axis('Value')\ .reset_index() print(result) # 方法2:长表转换+交叉表(扩展性更强,适合多列统计场景) melted = df.melt(value_vars=['Expected', 'Actual'], var_name='col', value_name='Value') result2 = pd.crosstab(melted['Value'], melted['col']).reset_index().rename_axis(columns=None) print(result2)
效果说明
两种方法最终输出的结果和你要求的结构完全一致:
| Value | Expected | Actual |
|---|---|---|
| A | 4 | 2 |
| B | 2 | 3 |
| C | 2 | 0 |
| D | 0 | 3 |
- 方法1逻辑简单直接,分别统计两列频次后合并,用
fillna(0)补全某列不存在的取值的计数 - 方法2扩展性更强,如果后续需要统计更多列的频次,仅需修改
melt的value_vars参数即可,无需新增多个统计逻辑
内容的提问来源于stack exchange,提问作者ponnob
相关产品推荐
相关产品推荐

