You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何反向遍历DataFrame,用自定义列表函数更新占位符值?

反向遍历DataFrame更新value列的实现问题

问题背景

我们有一个自定义列表函数f(示例为求和,可替换为其他逻辑),以及一个包含两列的DataFrame:

  • pred列:存储数字列表
  • value列:存储单个数字,其中-1是待更新的占位符

要求反向遍历DataFrame的行,将value为-1的行更新为:函数f作用于「所有pred列表包含当前行索引的行的value组成的列表」的结果(已保证行1到i的pred列表不会包含i,避免循环依赖)。

初始代码

import pandas as pd

def f(my_list):
    return sum(my_list)

data = {'pred':[[],[1],[1],[1],[2],[2,3],[2,4],[3],[3,4],[4],[6,7,9,10]]}

df = pd.DataFrame(data)
df.index = df.index + 1

df.loc[5,'value'] = 1
df.loc[8,'value'] = 0
df.loc[10,'value'] = 2
df.loc[11,'value'] = 100
df.value = df.value.fillna(-1).astype(int) # placeholder, the values cannot be negative

print(df)

初始输出

pred  value
1              []     -1
2             [1]     -1
3             [1]     -1
4             [1]     -1
5             [2]      1
6          [2, 3]     -1
7          [2, 4]     -1
8             [3]      0
9          [3, 4]     -1
10            [4]      2
11  [6, 7, 9, 10]    100

预期更新结果

第9行value:f([100]) = 100;
第7行value:f([100]) = 100;
第6行value:f([100]) = 100;
第4行value:f([2, 100, 100]) = 202;
第3行value:f([100, 0, 100]) = 200;
第2行value:f([1, 100, 100]) = 201;
第1行value:f([201, 200, 202]) = 603。

待完善代码

for i in range(len(df),0,-1):
  if df.loc[i,'value'] == -1:
    df.loc[i,'value'] = ???

实现方案

将待完善代码中的???替换为以下逻辑,即可实现需求:

f(df[df['pred'].apply(lambda x: i in x)]['value'].tolist())

逻辑说明

  1. df['pred'].apply(lambda x: i in x):生成布尔序列,标记DataFrame中哪些行的pred列表包含当前遍历的索引i
  2. df[...]['value'].tolist():筛选出符合条件的行,提取它们的value值并转为列表
  3. 将该列表传入自定义函数f计算结果,赋值给当前行的value

完整循环代码

for i in range(len(df), 0, -1):
    if df.loc[i, 'value'] == -1:
        related_values = df[df['pred'].apply(lambda x: i in x)]['value'].tolist()
        df.loc[i, 'value'] = f(related_values)

运行上述代码后,DataFrame的value列将按预期完成更新。

内容的提问来源于stack exchange,提问作者Vika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 05:43:15