如何反向遍历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())
逻辑说明
df['pred'].apply(lambda x: i in x):生成布尔序列,标记DataFrame中哪些行的pred列表包含当前遍历的索引idf[...]['value'].tolist():筛选出符合条件的行,提取它们的value值并转为列表- 将该列表传入自定义函数
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
相关产品推荐
相关产品推荐

