基于列值与多重索引的Pandas countif实现问题
解决MultiIndex DataFrame按组统计值为"1"的数量问题
嘿,我来帮你搞定这个统计问题!你遇到的核心点是数据里不只有0和1,直接求和会把其他数值也算进去,所以得先精准筛选出等于"1"的元素再计数。针对你的MultiIndex(YEAR和RACEETHN)场景,这里有几个简单靠谱的方法:
方法一:先转布尔值再分组求和
这是最直观的方式,先把整个DataFrame里等于"1"的元素转为True,其他转为False,然后对布尔值分组求和(因为True会被视为1,False视为0,求和就是计数):
# 假设你的DataFrame名为df bool_df = df == "1" # 如果"1"是数值类型就改成df == 1 result = bool_df.groupby(level=["YEAR", "RACEETHN"]).sum()
方法二:用groupby+agg指定列统计
如果你只想针对特定列(比如你测试的ACSUPPSV)统计,或者需要对不同列用不同逻辑,可以用agg方法:
单列统计
acs_result = df.groupby(level=["YEAR", "RACEETHN"])["ACSUPPSV"].apply(lambda x: (x == "1").sum()) # 或者用agg更清晰 acs_result = df.groupby(level=["YEAR", "RACEETHN"]).agg({"ACSUPPSV": lambda x: (x == "1").sum()})
多列批量统计
result = df.groupby(level=["YEAR", "RACEETHN"]).agg(lambda x: (x == "1").sum())
为什么你之前的groupby可能失败?
大概率是这两个原因:
- 直接用了
sum()而没有先筛选等于"1"的元素:因为数据里有其他非0非1的值,直接求和会把这些数值也加进去,结果自然不对。 - 没有正确指定分组的层级:如果你的MultiIndex名称不是
YEAR和RACEETHN,或者分组时没写level参数,会导致分组逻辑错误。
示例验证
我模拟了一个和你场景类似的DataFrame,你可以跑一下看看效果:
import pandas as pd # 构造示例数据 data = { "ACSUPPSV": ["1", "0", "2", "1", "1", "3"], "OTHER_COL": ["0", "1", "1", "2", "0", "1"], } # 创建MultiIndex行索引 index = pd.MultiIndex.from_tuples( [(2020, "White"), (2020, "White"), (2020, "Black"), (2021, "White"), (2021, "Black"), (2021, "Black")], names=["YEAR", "RACEETHN"] ) df = pd.DataFrame(data, index=index) # 执行统计 result = (df == "1").groupby(level=["YEAR", "RACEETHN"]).sum() print(result)
输出结果:
ACSUPPSV OTHER_COL YEAR RACEETHN 2020 Black 0 1 White 1 1 2021 Black 1 1 White 1 0
完全符合我们要的每个YEAR+RACEETHN组合下,各列值为"1"的数量统计~
内容的提问来源于stack exchange,提问作者Alison LT
相关产品推荐
相关产品推荐

