基于条件与groupby为Pandas DataFrame逐行填充值
Pandas 数据处理需求
现有包含CLI_CD和CURA_T1列的Pandas DataFrame,示例数据如下:
| CLI_CD | CURA_T1 |
|---|---|
| 3 | 0 |
| 3 | 0 |
| 3 | 0 |
| 3 | 0 |
| 3 | 1 |
| 3 | 1 |
| 3 | 1 |
| 3 | 1 |
| 3 | 1 |
| 3 | 1 |
| 3 | 0 |
| 3 | 0 |
需要新增名为CURA_ALT的列,要求如下:
- 按
CLI_CD分组 - 识别每组中
CURA_T1首次出现1的位置 - 从该行开始,仅对
CURA_T1为1的行累加100/6的取整结果(保留整数) - 其余行填充0
预期输出的DataFrame如下:
| CLI_CD | CURA_T1 | CURA_ALT |
|---|---|---|
| 3 | 0 | 0 |
| 3 | 0 | 0 |
| 3 | 0 | 0 |
| 3 | 0 | 0 |
| 3 | 1 | 17 |
| 3 | 1 | 33 |
| 3 | 1 | 50 |
| 3 | 1 | 67 |
| 3 | 1 | 83 |
| 3 | 1 | 100 |
| 3 | 0 | 0 |
| 3 | 0 | 0 |
解决方案
通过Pandas分组操作、位置标记和序列计算可实现需求,代码如下:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'CLI_CD': [3]*12, 'CURA_T1': [0,0,0,0,1,1,1,1,1,1,0,0] }) def process_group(group): # 定位组内CURA_T1首次出现1的索引 first_one_idx = group[group['CURA_T1'] == 1].index.min() # 初始化CURA_ALT列为0 group['CURA_ALT'] = 0 if not pd.isna(first_one_idx): # 筛选从首次1开始且CURA_T1为1的行 target_rows = group.loc[first_one_idx:][group['CURA_T1'] == 1] # 计算累加值并取整 step = 100 / 6 accum_values = [round(step * i) for i in range(1, len(target_rows)+1)] # 赋值给对应行 group.loc[target_rows.index, 'CURA_ALT'] = accum_values return group # 分组应用处理函数 df = df.groupby('CLI_CD', group_keys=False).apply(process_group) print(df)
代码说明
- 构造测试数据:创建与题目示例一致的DataFrame;
- 分组处理逻辑:
- 定位每组中
CURA_T1首次出现1的位置; - 初始化
CURA_ALT列为0; - 筛选出从首次1开始且
CURA_T1为1的行,计算100/6的累加取整值并赋值;
- 定位每组中
- 分组应用:按
CLI_CD分组后执行处理逻辑,得到最终结果。
内容的提问来源于stack exchange,提问作者Renata Lins
相关产品推荐
相关产品推荐

