You need to enable JavaScript to run this app. pandas查找DataFrame所有列的"-"并将对应前一列值存入新列F的实现与报错解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.07 19:06:04