You need to enable JavaScript to run this app. pandas多条件下为DataFrame新增分组维度的Action分类计数列
优惠活动
大模型
产品
解决方案
定价
更多

pandas多条件下为DataFrame新增分组维度的Action分类计数列

实现思路

你之前卡壳的核心原因是不知道transform可以直接在分组后的Series内部加条件判断,完全不需要提前过滤子集、拆分表再合并。整体逻辑就是按Location分组后,对每个分组内的Action列做匹配计数,计算结果自动对齐回原表的每一行。

具体实现代码

首先构造和示例一致的测试DataFrame:

import pandas as pd

df = pd.DataFrame({
    'Location': ['House1', 'House2', 'House3', 'House2', 'House2', 'House3'],
    'Action': ['Quote', 'Offer', 'Quote', 'Quote', 'Quote', 'Offer']
})

直接调用分组transform计算对应列:

# 按Location分组,统计每个组内Quote的总出现次数
df['Quotes'] = df.groupby('Location')['Action'].transform(
    lambda action_series: (action_series == 'Quote').sum()
)
# 按Location分组,统计每个组内Offer的总出现次数
df['Offers'] = df.groupby('Location')['Action'].transform(
    lambda action_series: (action_series == 'Offer').sum()
)

运行后输出的结果和目标效果完全一致:

Location  Action  Quotes  Offers
0   House1   Quote       1       0
1   House2   Offer       2       1
2   House3   Quote       1       1
3   House2   Quote       2       1
4   House2   Quote       2       1
5   House3   Offer       1       1
补充说明
  • 如果你需要的不是全组总计数,是逐行的滚动累计值(即到当前行为止,对应Location已经出现过的Quote/Offer次数),只需要把上面的.sum()换成.cumsum()即可,写法如下:
    # 逐行累计版本
    df['Quotes_cum'] = df.groupby('Location')['Action'].transform(
        lambda action_series: (action_series == 'Quote').cumsum()
    )
    df['Offers_cum'] = df.groupby('Location')['Action'].transform(
        lambda action_series: (action_series == 'Offer').cumsum()
    )
    
  • 这种写法的优势是全程不会打乱原表的行顺序,不需要做表连接操作,执行效率比拆分筛选再合并的方式高很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 12:45:03