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

Pandas中为groupby后的value_counts补全指定类型索引并填0

解决Pandas分组统计指定活动类型并映射到主表的问题

步骤1:生成指定类型的分组统计(缺失补0)

先定义需要统计的目标活动类型,通过unstack将分组后的结果转为宽表,再用reindex确保只保留指定类型,缺失的类型自动填充0:

# 定义需要统计的四类活动
target_activity_types = ['Call', 'Email', 'LinkedIn', 'Meeting']

# 执行分组统计并重构表格
df_activity_counts = (
    df_activities.groupby(['Account ID'])['Type']
    .value_counts()  # 统计每个Account ID下各Type的数量
    .unstack(fill_value=0)  # 将Type转为列,缺失值填0
    .reindex(columns=target_activity_types, fill_value=0)  # 仅保留指定类型,新增列填0
)

步骤2:将统计结果映射到df_acc表

推荐使用merge方法(比map更稳定,能处理主表中存在但活动表中没有的Account ID),通过左连接保留df_acc的所有数据,缺失统计值补0:

# 合并统计结果到df_acc
df_acc = df_acc.merge(
    df_activity_counts,
    left_on='Account ID',
    right_index=True,  # df_activity_counts的索引是Account ID
    how='left'  # 保留df_acc的所有行
).fillna(0)

# 可选:重命名列以匹配需求格式
df_acc.rename(
    columns={
        'Call': 'Call Activity',
        'Email': 'Email Activity',
        'LinkedIn': 'LinkedIn Activity',
        'Meeting': 'Meeting Activity'
    },
    inplace=True
)

对原示例代码的修正

你提供的示例代码df_acc['Email Activity'] = df_acc['Account ID'].map(df_contacts.groupby(['Account ID'])['Type']='Email'.sum())存在语法错误,正确的单类型统计写法应为:

# 单类型统计的正确写法
email_counts = df_contacts[df_contacts['Type'] == 'Email'].groupby(['Account ID']).size()
df_acc['Email Activity'] = df_acc['Account ID'].map(email_counts).fillna(0)

但前面的批量处理方法更高效,无需为每个类型单独写代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:54:59