遍历Pandas DataFrame行 清空指定字符串后至特定列前的单元格值
Pandas DataFrame指定区间单元格置空实现
需求说明
- 每行存在固定目标字符串
a,需要将该字符串所在列之后、到zz列之前的所有单元格值清空 zz列本身、以及zz列之后的所有列(如示例中的aa列)取值保持不变- 示例输入输出如下(原示例output字典存在语法笔误,
zz行末尾缺失逗号):
# 输入df df = { 'bb': ['a', 'z', 'y'], 'vv': ['b', 'a', 'z'], 'ww': ['c', 'b', 'a'], 'xx': ['d', 'c', 'b'], 'yy': ['e', 'd', 'c'], 'zz': ['f', 'e', 'd'], 'aa': ['g', 'f', 'e'] } # 预期output output = { 'bb': ['a', 'z', 'y'], 'vv': ['', 'a', 'z'], 'ww': ['', '', 'a'], 'xx': ['', '', ''], 'yy': ['', '', ''], 'zz': ['f', 'e', 'd'], 'aa': ['g', 'f', 'e'] }
实现代码
优先用pandas内置向量化方法定位目标位置,避免全量逐行逐元素遍历,数据量较大时性能更好:
import pandas as pd # 配置参数 target_str = 'a' end_keep_col = 'zz' # 初始化DataFrame df = pd.DataFrame({ 'bb': ['a', 'z', 'y'], 'vv': ['b', 'a', 'z'], 'ww': ['c', 'b', 'a'], 'xx': ['d', 'c', 'b'], 'yy': ['e', 'd', 'c'], 'zz': ['f', 'e', 'd'], 'aa': ['g', 'f', 'e'] }) # 获取边界列的索引,划定需要处理的列范围 end_col_pos = df.columns.get_loc(end_keep_col) process_columns = df.columns[:end_col_pos] # 定位每行第一个匹配目标字符串的列 match_col = df[process_columns].eq(target_str).idxmax(axis=1) # 将匹配位置之后、边界列之前的单元格置空 for row_idx, col_name in match_col.items(): col_pos = process_columns.get_loc(col_name) if col_pos < len(process_columns) - 1: empty_cols = process_columns[col_pos + 1 :] df.loc[row_idx, empty_cols] = '' # 验证输出,结果和预期output完全一致 print(df.to_dict(orient='list'))
补充说明
- 上述代码默认所有行在
zz列之前都存在目标字符串,如果存在无匹配的行,可在置空逻辑前增加判断,跳过匹配位置不存在的行即可 - 如果需要修改目标字符串或边界列,直接调整
target_str和end_keep_col两个参数即可复用
内容的提问来源于stack exchange,提问作者achi00
相关产品推荐
相关产品推荐

