You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计DataFrame中代表关联的1与非关联的0的总数?

问题描述

我有一个以矩阵形式展示的DataFrame,希望统计其中代表“关联”(值为1)和代表“非关联”(值为0)的单元格总数。尝试使用df.count()函数,但无法得到想要的1和0的统计结果,恳请提供解决方法。

相关代码

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

df = pd.read_csv('Res_Gov.csv')  

df1 = df.set_index('Indicators').T 

# Set up the matplotlib figure
fig, ax = plt.subplots(figsize=(12, 12))

colors = ["#f4a261","#2a9d8f"] 
cmap = LinearSegmentedColormap.from_list('Custom', colors, len(colors))

# Draw the heatmap with the mask and correct aspect ratio
df1 = sns.heatmap(df1, cmap=cmap, square=True,
                  linewidths=.5, cbar_kws={"shrink": .5})  # 此处df1被覆盖为Axes对象,不再是DataFrame

# Set the colorbar labels
ax.set_xlabel("Indicators")
ax.set_ylabel("Resilience Criteria")
ax.tick_params(axis='x', rotation=90)
colorbar = ax.collections[0].colorbar
colorbar.set_ticks([0.25,0.75])
colorbar.set_ticklabels(['Not Correlated', 'Correlated'])
fig.tight_layout()  
plt.show()

DataFrame片段

,Indicators,Robustness,Flexibility,Resourcefulness,Redundancy,Diversity,Independence,Foresight Capacity,Coordination Capacitiy,Collaboration Capacity,Connectivity & Interdependence,Agility,Adaptability,Self-Organization,Creativity & Innovation,Efficiency,Equity
0,G1,1,1,1,0,0,1,1,1,1,1,1,1,0,1,1,1
1,G2,1,0,0,0,0,1,0,1,1,1,1,0,0,1,1,1
2,G3,1,0,1,0,0,1,1,1,1,1,1,1,1,1,0,1
3,G4,1,1,1,0,1,0,1,1,1,1,1,1,1,1,0,1
4,G5,1,0,1,0,0,0,0,1,0,1,1,0,0,0,1,0
5,G6,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,1
6,G7,1,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0
7,G8,1,1,0,0,0,1,1,1,1,0,1,1,0,0,0,0
8,G9,1,0,1,0,0,1,1,1,1,0,1,1,0,1,0,1
9,G10,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1
10,G11,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1
11,G12,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,0
12,G13,1,1,1,0,1,0,1,1,0,1,1,0,0,0,0,0
13,G14,1,0,1,0,1,0,1,1,1,1,1,1,0,0,1,1
14,G15,1,1,1,0,1,0,1,1,1,1,1,1,1,1,0,1
15,G16,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1
16,G17,1,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0
17,G18,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,1
18,G19,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
19,G20,1,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1
20,G21,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1
21,G22,1,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1
22,G23,1,0,1,0,0,1,1,0,1,0,0,1,1,1,0,0

矩阵可视化

关联矩阵可视化


解决方法

先修正代码中的数据覆盖问题

你代码里的df1在执行sns.heatmap()后会被覆盖成Axes对象,不再是原始的转置DataFrame。建议修改代码保留转置后的DataFrame:

# 转置后保留DataFrame
df_transposed = df.set_index('Indicators').T 
# 绘制热图时不覆盖原始数据
sns.heatmap(df_transposed, cmap=cmap, square=True, linewidths=.5, cbar_kws={"shrink": .5}, ax=ax)

统计0和1的总数

以下是几种可行的统计方式:

方法1:全局统计所有单元格的0/1数量

将DataFrame转为一维数组后,用value_counts()直接统计值的出现次数:

# 提取所有数值并转为一维数组
all_values = df_transposed.values.flatten()
count_result = pd.Series(all_values).value_counts()

print(f"非关联(0)数量:{count_result[0]}")
print(f"关联(1)数量:{count_result[1]}")

方法2:通过求和与总单元格数计算

因为1的总数等于所有单元格的和,0的总数等于总单元格数减去1的数量:

total_cells = df_transposed.size
correlated_count = df_transposed.sum().sum()
not_correlated_count = total_cells - correlated_count

print(f"关联(1)总数:{correlated_count}")
print(f"非关联(0)总数:{not_correlated_count}")

方法3:按列/行单独统计(可选)

如果需要按每个指标或韧性准则分别统计0和1的数量:

# 按列(Indicators)统计
column_wise_counts = df_transposed.apply(pd.Series.value_counts)
# 按行(Resilience Criteria)统计
row_wise_counts = df_transposed.T.apply(pd.Series.value_counts)

为什么df.count()不行?

df.count()的作用是统计每列中的非空值数量,而非特定值的出现次数,这是它的设计逻辑,所以无法得到0和1的个数。

内容的提问来源于stack exchange,提问作者JamesArthur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:12:11