如何用Python按指定条件修改并筛选DataFrame
问题描述
现有如下DataFrame:
| col1 | col2 | col3 |
|---|---|---|
| A1 | data 1 | |
| Val B | data 2 | data 6 |
| Val B | data 3 | data |
| A2 | data 4 | data |
| Val B | data 5 | data 7 |
需求:在col1列中,若单元格值为Val B且紧跟在以"A"开头的单元格下方,则将该Val B替换为上方以"A"开头的单元格值,保留该行其他列的值;忽略不满足该条件的Val B行,最终得到如下结果:
| col1 | col2 | col3 |
|---|---|---|
| A1 | data 2 | data 6 |
| A2 | data 5 | data 7 |
Python实现方案
可以通过pandas的移位方法标记符合条件的行,再提取并处理目标数据:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'col1': ['A1', 'Val B', 'Val B', 'A2', 'Val B'], 'col2': ['data 1', 'data 2', 'data 3', 'data 4', 'data 5'], 'col3': ['', 'data 6', 'data', 'data', 'data 7'] }) # 标记符合条件的行:当前行是Val B,且前一行是以"A"开头的值 mask = (df['col1'] == 'Val B') & (df['col1'].shift().str.startswith('A', na=False)) # 提取目标行并替换col1值 result = df[mask].copy() result['col1'] = df['col1'].shift()[mask] # 重置索引(可选,让结果索引更规整) result = result.reset_index(drop=True) print(result)
代码说明
df['col1'].shift():获取每行的前一行col1值df['col1'].shift().str.startswith('A', na=False):判断前一行值是否以"A"开头,na=False确保空值不被误判- 组合的
mask条件精准筛选出需要处理的行 - 对筛选出的行,直接将
col1替换为前一行的"A"开头值,保留其他列数据
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

