如何用Pandas统计pox与sex列的四种组合数量?代码报错求解
统计水痘与性别分组的四类计数
错误原因分析
你最初的代码报错是因为逻辑与运算符&的优先级高于等于运算符==,导致条件被错误解析,必须给每个布尔判断单独加括号。后续的分组写法逻辑错误,groupby(['SEX']==1)是将布尔序列作为分组键,完全不符合统计需求。
解决方法
方法一:修正索引筛选写法
直接修正条件的括号问题,即可得到正确的整数结果:
male_pos = len(df_pox.loc[(df_pox['pox'] == 1) & (df_pox['SEX'] == 1)]) male_neg = len(df_pox.loc[(df_pox['pox'] == 2) & (df_pox['SEX'] == 1)]) female_pos = len(df_pox.loc[(df_pox['pox'] == 1) & (df_pox['SEX'] == 2)]) female_neg = len(df_pox.loc[(df_pox['pox'] == 2) & (df_pox['SEX'] == 2)])
方法二:用交叉表高效生成统计结果
使用pd.crosstab可以一步生成两列的交叉统计表,再提取对应值,代码更简洁:
import pandas as pd # 生成sex为行、pox为列的交叉统计表 cross_tab = pd.crosstab(df_pox['SEX'], df_pox['pox']) # 提取四个整数结果 male_pos = cross_tab.loc[1, 1] male_neg = cross_tab.loc[1, 2] female_pos = cross_tab.loc[2, 1] female_neg = cross_tab.loc[2, 2]
方法三:分组统计
通过groupby同时按SEX和pox分组,统计每组的数量后提取对应值:
# 按性别和水痘情况分组,统计每组的样本数 grouped_counts = df_pox.groupby(['SEX', 'pox']).size() # 提取对应分组的计数 male_pos = grouped_counts.loc[(1, 1)] male_neg = grouped_counts.loc[(1, 2)] female_pos = grouped_counts.loc[(2, 1)] female_neg = grouped_counts.loc[(2, 2)]
内容的提问来源于stack exchange,提问作者Brian Cox
相关产品推荐
相关产品推荐

