如何按分组与mask列将Pandas DataFrame中首个0转为1?
解决方案
步骤说明
要实现按组修改第一个符合条件的target_col值,核心是精准定位每个组内mask_col为TRUE且target_col为0的第一行,再单独修改该行的值。
代码实现
首先构造你的样本数据:
import pandas as pd data = { 'mask_col': [True, True, False, True, False, True, True, False, False, False, True, False], 'categorical_col': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'], 'target_col': [1, 1, None, 0, None, 0, 1, None, None, None, 0, None] } df = pd.DataFrame(data)
然后执行修改操作:
# 1. 标记所有待检查的行:mask_col为True且target_col等于0 candidate_mask = df['mask_col'] & (df['target_col'] == 0) # 2. 按组筛选出每个组内第一个符合条件的行 first_target_row = df[candidate_mask].groupby('categorical_col').head(1) # 3. 修改这些行的target_col值为1 df.loc[first_target_row.index, 'target_col'] = 1
结果验证
执行后查看DataFrame,第4行(索引3)和第11行(索引10)的0已改为1,第6行(索引5)的0保持不变,完全符合需求:
| index | mask_col | categorical_col | target_col |
|---|---|---|---|
| 0 | True | A | 1 |
| 1 | True | A | 1 |
| 2 | False | A | NaN |
| 3 | True | A | 1 |
| 4 | False | A | NaN |
| 5 | True | A | 0 |
| 6 | True | B | 1 |
| 7 | False | B | NaN |
| 8 | False | B | NaN |
| 9 | False | B | NaN |
| 10 | True | B | 1 |
| 11 | False | B | NaN |
代码解释
candidate_mask:先筛选出所有可能需要修改的行,缩小处理范围。groupby('categorical_col').head(1):对筛选后的行按组取第一行,精准锁定每个组内的目标行。df.loc[first_target_row.index, 'target_col'] = 1:通过索引定位目标行,直接修改target_col的值。
内容的提问来源于stack exchange,提问作者peho15ae
相关产品推荐
相关产品推荐

