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

