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
相关产品推荐
相关产品推荐

