基于行内条件填充Pandas DataFrame(对标Excel COUNTIFS函数)
高效实现CountPreviousMonth列的Python方案
需求回顾
新增CountPreviousMonth列需满足以下规则:
- 仅统计同一Cond1分组内的行
- 统计行需满足
Amount ≠ 0 - 统计行的
Month必须早于当前行的Month - 特殊情况:Month=1时计数为0;当前行Amount=0时,计数继承该分组前序有效计数
最优实现(基于Pandas矢量化操作)
利用Pandas的分组与矢量化计算,完全避免循环,适配大数据量场景:
步骤1:数据预处理(确保排序)
import pandas as pd # 替换为你的实际数据集 df = pd.read_csv("your_data.csv") # 关键前提:按Cond1和Month升序排列,保证月份顺序正确 df = df.sort_values(['Cond1', 'Month']).reset_index(drop=True)
步骤2:计算目标列
# 标记Amount不为0的有效行 df['is_valid'] = df['Amount'] != 0 # 按Cond1分组,累计有效行数量后下移一行,实现"统计之前月份"的需求 df['CountPreviousMonth'] = df.groupby('Cond1')['is_valid'].cumsum().shift(fill_value=0) # 清理临时列(可选) df.drop('is_valid', axis=1, inplace=True)
示例结果验证
假设输入示例数据:
| Cond1 | Month | Amount |
|---|---|---|
| a | 1 | 100 |
| a | 2 | 200 |
| a | 3 | 0 |
| b | 1 | 50 |
| b | 2 | 0 |
| b | 3 | 150 |
处理后输出:
| Cond1 | Month | Amount | CountPreviousMonth |
|---|---|---|---|
| a | 1 | 100 | 0 |
| a | 2 | 200 | 1 |
| a | 3 | 0 | 2 |
| b | 1 | 50 | 0 |
| b | 2 | 0 | 1 |
| b | 3 | 150 | 1 |
方案优势
- 全程采用Pandas矢量化操作,无显式循环,处理百万级数据效率远超循环实现
- 分组逻辑自动适配多Cond1分组场景,无需额外分支判断
shift(fill_value=0)直接实现"仅统计早于当前月份"的需求,逻辑简洁直观
内容的提问来源于stack exchange,提问作者javierzamb
相关产品推荐
相关产品推荐

