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

pandas按country字段groupby后按feature条件计算count值实现问题

实现方案

你可以通过pandas的groupby结合自定义聚合逻辑实现需求,以下是两种常用写法:

写法1:自定义聚合函数(直观易读)

适合数据量不大的场景,逻辑清晰易懂:

import pandas as pd

# 构造原始DataFrame
country = ['US', 'US', 'US', 'UK', 'UK', 'Canada', 'Canada', "Mexico"]
feature =  [2, 2, 2, 1, 1, 2, 2, 1]
ID = [1, 2, 1, 3, 4, 1, 2, 1]  
df = pd.DataFrame(list(zip(country,feature, ID)), columns =['country', 'feature', 'ID'])

# 定义分组计算规则
def calc_count(group):
    # 同一国家的feature值统一,取第一个值判断即可
    if group['feature'].iat[0] == 2:
        # 返回ID的唯一值数量
        return group['ID'].nunique()
    # 返回分组总条目数
    return len(group)

# 分组聚合得到结果
result = df.groupby('country', as_index=False).apply(calc_count)
result.columns = ['country', 'count']
print(result)

写法2:预聚合指标(性能更高)

适合大数据量场景,避免逐行调用自定义函数的性能损耗:

# 先批量聚合每个国家的所有需要的指标
group_agg = df.groupby('country').agg(
    feature_val=('feature', 'first'),
    id_unique=('ID', 'nunique'),
    total_cnt=('country', 'count')
).reset_index()

# 按规则生成count列
group_agg['count'] = group_agg.apply(
    lambda row: row['id_unique'] if row['feature_val'] == 2 else row['total_cnt'],
    axis=1
)

# 提取最终需要的字段
result = group_agg[['country', 'count']].reset_index(drop=True)
print(result)

输出结果

两种写法的输出完全符合预期:

country  count
0      US      2
1      UK      2
2  Canada      2
3  Mexico      1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:57:02