如何在Python中基于多列行值生成统计新DataFrame?
问题
我有多列仅包含0或1的数据,示例表格如下:
| 苹果 | 橙子 | 梨 |
|---|---|---|
| 1 | 0 | 1 |
| 0 | 0 | 1 |
| 1 | 1 | 0 |
我希望统计每列中0的数量(存入“错误数”列)和1的数量(存入“正确数”列),生成如下格式的新DataFrame:
| 水果 | 正确数 | 错误数 |
|---|---|---|
| 苹果 | 2 | 1 |
| 橙子 | 1 | 2 |
| 梨 | 2 | 1 |
尝试过结合value_counts()、groupby()和pandas.pivot_table,但在表格操作环节遇到困难。
解决方案
这里有几种简洁的实现方式:
方法一:求和+总行数计算
因为1的数量等于列的求和结果,0的数量等于总行数减去1的数量,代码如下:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ '苹果': [1, 0, 1], '橙子': [0, 0, 1], '梨': [1, 1, 0] }) # 统计并整理结果 result = pd.DataFrame({ '正确数': df.sum(), '错误数': len(df) - df.sum() }).reset_index().rename(columns={'index': '水果'}) print(result)
方法二:宽表转长表+交叉统计
先将宽格式数据转为长格式,再用交叉表统计数量:
import pandas as pd df = pd.DataFrame({ '苹果': [1, 0, 1], '橙子': [0, 0, 1], '梨': [1, 1, 0] }) # 宽表转长表 melted_df = df.melt(var_name='水果', value_name='数值') # 生成交叉统计表格 cross_table = pd.crosstab(melted_df['水果'], melted_df['数值']) # 重命名列并整理结构 result = cross_table.rename(columns={1: '正确数', 0: '错误数'}).reset_index() print(result)
方法三:apply+value_counts
对每列应用value_counts统计值的数量,再调整格式:
import pandas as pd df = pd.DataFrame({ '苹果': [1, 0, 1], '橙子': [0, 0, 1], '梨': [1, 1, 0] }) # 每列统计值的数量,转置后填充缺失值并转为整数 counts_df = df.apply(pd.Series.value_counts).T.fillna(0).astype(int) # 重命名列并重置索引 result = counts_df.rename(columns={1: '正确数', 0: '错误数'}).reset_index().rename(columns={'index': '水果'}) print(result)
内容的提问来源于stack exchange,提问作者Beavis
相关产品推荐
相关产品推荐

