我有一个由用户定义的列表的函数(函数f).比方说,它是列表元素的总和,但也可以是另一个函数.

然后我有一个包含两列的数据帧:包含数字列表的‘pred’和包含单个数字的‘Value’.值-1是需要更新的占位符.

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

现在,我必须以相反的顺序遍历df的行,并使用那些在他们的pred列表中有i的值列表的函数f更新值.保证i不会出现在pred列的列表中,第1行到第i行.

在本例中,我们应该有:

value in row 9: f([100]) = 100;
value in row 7: f([100]) = 100;
value in row 6: f([100]) = 100;
value in row 4: f([2, 100, 100]) = 202;
value in row 3: f([100, 0, 100]) = 200;
value in row 2: f([1, 100, 100]) = 201;
value in row 1: f([201, 200, 202]) = 603.

所以,我需要一些帮助,教你如何做一个循环来完成.

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

如有任何建议,我们不胜感激.

推荐答案

IIUC,您可以创建被其他索引引用的索引的词典.然后反向循环索引,并将相关行编入索引以传递到f:

s = df['pred'].explode()
dic = s.index.groupby(s)
# {1: [2, 3, 4], 2: [5, 6, 7], 3: [6, 8, 9], ...}

for i in df.index[df['value'].eq(-1)][::-1]:
    df.loc[i, 'value'] = f(df.loc[dic.get(i, []), 'value'])

更新后的DataFrame:

             pred  value
1              []    603
2             [1]    201
3             [1]    200
4             [1]    202
5             [2]      1
6          [2, 3]    100
7          [2, 4]    100
8             [3]      0
9          [3, 4]    100
10            [4]      2
11  [6, 7, 9, 10]    100

一步一步地分解循环,这样做:

df.loc[9, 'value'] = f(df.loc[[11], 'value'])       # f([100])
df.loc[7, 'value'] = f(df.loc[[11], 'value'])       # f([100])
df.loc[6, 'value'] = f(df.loc[[11], 'value'])       # f([100])
df.loc[4, 'value'] = f(df.loc[[7, 9, 10], 'value']) # f([100, 100, 2])
df.loc[3, 'value'] = f(df.loc[[6, 8, 9], 'value'])  # f([100, 0, 100])
df.loc[2, 'value'] = f(df.loc[[5, 6, 7], 'value'])  # f([1, 100, 100])
df.loc[1, 'value'] = f(df.loc[[2, 3, 4], 'value'])  # f([201, 200, 202])

Python相关问答推荐

删除最后一个pip安装的包

处理(潜在)不断增长的任务队列的并行/并行方法

海运图:调整行和列标签

如何获得每个组的时间戳差异?

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

使用Python从URL下载Excel文件

如何启动下载并在不击中磁盘的情况下呈现响应?

为什么常规操作不以其就地对应操作为基础?

如何在Python请求中组合多个适配器?

递归函数修饰器

如何从比较函数生成ngroup?

使用np.fft.fft2和cv2.dft重现相位谱.为什么结果并不相似呢?

对于标准的原始类型注释,从键入`和`从www.example.com `?

多索引数据帧到标准索引DF

高效地计算数字数组中三行上三个点之间的Angular

我怎样才能让深度测试在OpenGL中使用Python和PyGame呢?

如何在不不断遇到ChromeDriver版本错误的情况下使用Selify?

有没有一种方法可以根据不同索引集的数组从2D数组的对称子矩阵高效地构造3D数组?

关于数字S种子序列内部工作原理的困惑

如何在微调Whisper模型时更改数据集?