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

基于Pandas实现类Excel COUNTIFS的动态≥条件计数

在Python中实现动态COUNTIFS等效功能(Pandas方案)

问题说明

需要实现类似Excel COUNTIFS的变体逻辑:针对参数数据集中的每一行,统计人口数据集中同时满足以下两个条件的条目数量:

  • 与当前行type字段值一致
  • actual_score ≥ 当前行的required_score值

参数数据集(df_params)

type    required_score
    A       4
    A       5
    A       6
    A       7
    B       1
    B       3
    B       8
    B       9
    C       2
    C       5
    C       6
    C       7
    C       8

人口数据集(df_pop)

type    actual_score
    A       3
    A       2
    A       7
    A       5
    B       1
    B       3
    B       8
    B       9
    C       8
    C       8
    C       3
    C       2

预期输出

为参数数据集新增available_population列,结果如下:

type    required_score  available_population
    A       4               2
    A       5               2
    A       6               1
    A       7               1
    B       1               4
    B       3               3
    B       8               2
    B       9               1
    C       2               4
    C       5               2
    C       6               2
    C       7               2
    C       8               2

Pandas解决方案

以下方案基于groupby、agg等函数实现,避免逐行循环的低效操作:

1. 加载数据集

首先将示例数据转为Pandas DataFrame:

import pandas as pd
import numpy as np

# 参数数据集
df_params = pd.DataFrame({
    'type': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'],
    'required_score': [4,5,6,7,1,3,8,9,2,5,6,7,8]
})

# 人口数据集
df_pop = pd.DataFrame({
    'type': ['A','A','A','A','B','B','B','B','C','C','C','C'],
    'actual_score': [3,2,7,5,1,3,8,9,8,8,3,2]
})

2. 高效分组统计方案

通过预计算分组后的分数计数,再映射到参数数据集:

# 对人口数据集按type分组,预计算每个分数及以上的条目数
def build_count_mapper(group):
    # 对分组内的分数降序排序
    sorted_scores = sorted(group.unique(), reverse=True)
    # 计算每个分数对应的符合条件的数量
    score_counts = {score: (group >= score).sum() for score in sorted_scores}
    
    # 处理参数中存在、但人口数据里没有的分数
    def count_matches(required_score):
        for score in sorted_scores:
            if score >= required_score:
                return score_counts[score]
        return 0
    return count_matches

# 生成每个type对应的计数映射函数
type_count_mappers = df_pop.groupby('type')['actual_score'].apply(build_count_mapper)

# 为参数数据集添加结果列
df_params['available_population'] = df_params.apply(
    lambda row: type_count_mappers[row['type']](row['required_score']),
    axis=1
)

3. 简化版方案(适合小数据集)

如果数据量不大,也可以用合并+广播比较的方式快速实现:

# 按type分组,将每组的actual_score转为列表
grouped_actual = df_pop.groupby('type')['actual_score'].agg(list).reset_index()
# 合并参数数据集与分组后的人口数据
merged_df = df_params.merge(grouped_actual, on='type', how='left')
# 统计符合条件的数量
df_params['available_population'] = merged_df.apply(
    lambda row: np.sum(np.array(row['actual_score']) >= row['required_score']),
    axis=1
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:35:17