我有list形式的以下源路径-

['node_A','node_B','node_C', 'node_D']


还有其他几种源路径,上面仅是一个示例。 Node_Bnode_A的来源,node_Cnode_B的来源,依此类推。

SOURCE  DESTINATION
node_B  node_A
node_C  node_B
node_D  node_C


我有一个dataframe,其中包含以下列-

source  destination cost_1  cost_2  cost_3  cost_4
node_B  node_A       1       5       7      5
node_C  node_B       3       1       2      1
node_D  node_C       1       5       1      5
node_Y  node_X       3       2       7      1
node_Z  node_Y       1       5       1      2


根据我的源路径,我想在相应的源节点和目标节点上过滤dataframe并求和这些对的成本。例如,在上面的源路径['node_A','node_B','node_C', 'node_D']中,我应该得到如下内容-

source_path                                       cost_1  cost_2  cost_3  cost_4
['node_A','node_B','node_C', 'node_D']            5       11      10      11


我可以通过基于源和目标对(针对源路径的3对对中的每对)过滤dataframe来实现此目的。然后,我将3行附加在一起,然后对成本进行求和。但是,这需要花费大量时间。是这样做的有效方法吗?如果需要,我可以在此处粘贴我的代码。

最佳答案

从列表,DataFrame中创建具有原始,merge和最后一次整形的sum一行DataFrame

L = ['node_A','node_B','node_C', 'node_D']

df1 = (pd.DataFrame({'source':L[1:], 'destination':L[:-1]})
         .merge(df)
         .drop('destination', 1)
         .sum()
         .to_frame()
         .T
         .assign(source=[L])
         .rename(columns={'source':'source_path'}))
print (df1)

                        source_path cost_1 cost_2 cost_3 cost_4
0  [node_A, node_B, node_C, node_D]      5     11     10     11

09-11 17:17