如何统计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
相关产品推荐
相关产品推荐

