pandas查找DataFrame所有列的"-"并将对应前一列值存入新列F的实现与报错解决
原代码问题定位
- 遍历逻辑完全错位:使用
np.ndenumerate遍历数组时没有利用返回的行列索引信息,判断到"-"时写的x-1是字符串与数字的减法操作,从根本上无法定位、获取同行动态前一列的值 - 列表收集逻辑错配:逐单元格单独创建临时列表收集结果,最终生成的
g长度与DataFrame行数完全不匹配,赋值时触发长度不一致报错
可运行实现方案
核心处理逻辑:从B列开始逐列扫描所有单元格,一旦发现值为"-",直接取同一行、该单元格左侧紧邻列的值,存入对应行的F列。
完整可运行代码如下:
import pandas as pd import numpy as np # 构造初始DataFrame df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'}, 'B': {0: '-', 1: 'a', 2: '-', 3: 'b', 4: 'd'}}) # 保留原代码中C/D/E列的构造逻辑 df['C'] = np.where(df['B'].isin(df['A'].values), df['B'], np.nan) df['C'] = df['C'].map(dict(zip(df.A.values, df.B.values))) df['D'] = np.where(df['C'].isin(df['B'].values), df['C'], np.nan) df['D'] = df['D'].map(dict(zip(df.B.values, df.C.values))) df['E'] = np.where(df['D'].isin(df['C'].values), df['D'], np.nan) df['E'] = df['E'].map(dict(zip(df.C.values, df.D.values))) # 生成F列逻辑 col_values = df.iloc[:, :5].values f_result = [] # 逐行处理 for row in col_values: row_f_val = np.nan # 从第2列(索引1,即B列)开始扫描,第1列(A列)无前置列无需判断 for col_pos in range(1, len(row)): if row[col_pos] == "-": # 匹配到"-"时取左侧紧邻列值 row_f_val = row[col_pos - 1] break f_result.append(row_f_val) df['F'] = f_result print(df)
运行效果说明
- 匹配需求示例:B列第0行、第2行存在
"-"时,F列对应行自动填入同行A列的a、c - 逻辑通用:如果后续C/D/E列出现
"-",会自动对应取该列左侧紧邻的B/C/D列值填入F列,无需修改代码 - 若单行存在多个
"-",当前逻辑取最靠左的第一个匹配项;如果需要收集所有匹配值,去掉内层循环的break,把收集到的值组成列表存入行结果即可
内容的提问来源于stack exchange,提问作者Afshin
相关产品推荐
相关产品推荐

