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

基于列值与多重索引的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:03:52