如何在Pandas中实现Excel COUNTIFS?寻求无临时步骤的优化方案
问题描述
在Pandas中实现Excel的COUNTIFS(多条件计数)功能,统计每组key1 × key2组合下cond == 1的数量,需要得到两个结果:
- 按分组键展示统计结果的DataFrame
- 将统计结果映射回原DataFrame的版本
现有实现需要创建临时列,寻求更优的计算方法。
示例数据
import pandas as pd d = {'key1': list('AAAACB'), 'key2': list('XYXXXX'), 'cond': [1, 2, 1, 2, 1, 2]} df = pd.DataFrame(data=d) # 输出结果: # key1 key2 cond # 0 A X 1 # 1 A Y 2 # 2 A X 1 # 3 A X 2 # 4 C X 1 # 5 B X 2
优化实现方法
无需创建临时列,利用Pandas中布尔值的特性(True等价于1,False等价于0),直接对条件表达式进行分组操作即可完成需求:
1. 获取分组统计结果(对应COUNTIFS)
pivot_key = ["key1", "key2"] # 方式1:使用apply df_grp = df.groupby(pivot_key, dropna=False)["cond"].apply(lambda x: (x == 1).sum()).reset_index(name="count_cond_1") # 方式2:更简洁的agg写法 # df_grp = df.groupby(pivot_key, dropna=False).agg(count_cond_1=("cond", lambda x: (x == 1).sum())).reset_index() df_grp # 输出结果: # key1 key2 count_cond_1 # 0 A X 2 # 1 A Y 0 # 2 B X 0 # 3 C X 1
2. 将统计结果映射回原DataFrame
pivot_key = ["key1", "key2"] # 使用transform直接计算每组符合条件的数量并映射回原表 df["count_cond_1"] = df.groupby(pivot_key, dropna=False)["cond"].transform(lambda x: (x == 1).sum()) df # 输出结果: # key1 key2 cond count_cond_1 # 0 A X 1 2 # 1 A Y 2 0 # 2 A X 1 2 # 3 A X 2 2 # 4 C X 1 1 # 5 B X 2 0
说明
上述方法省去了临时列的创建步骤,直接在分组操作中完成条件判断与计数,代码更简洁紧凑,同时保持了逻辑的清晰性。
内容的提问来源于stack exchange,提问作者Alexandre_K
相关产品推荐
相关产品推荐

