使用pandas将累积值添加到框架中

eqfvzcg8  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(117)

我有一个数据集,有3列Point_A,Point_B和Range,如下面的数据集,

Point_A  Point_B Range
0   1001400 1001402 9.7
1   1001402 1001404 20.2
2   1001404 1001406 16.0
3   1001406 1001408 21.7
4   1001408 1001410 11.1
5   1001410 1001412 15.6

字符串
现在我想创建一个包含所有可能的组合和它的累积值的嵌套框,就像下面的数据集一样,如果我想计算1001400到1001404的值,那么它的值应该是9.7 + 20.2 = 29.9等等。输出嵌套框:

Point_A Point_B Cumulative_Range
1001400 1001402 9.7
1001400 1001404 29.9
1001400 1001406 45.9
1001400 1001408 67.6
1001400 1001410 78.7
1001400 1001412 94.3
1001402 1001404 20.2
1001402 1001406 36.2
1001402 1001408 57.9
1001402 1001410 69
1001402 1001412 84.6


我试过下面的代码,但它只返回原始的框架,导入Pandas作为PD

df = df.sort_values(['Point_A', 'Point_B'])

cumulative_df = pd.DataFrame(columns=['Point_A', 'Point_B', 'cumulative_range'])

for Point_A in df['Point_A'].unique():

    subset_df = df[df['Point_A'] == Point_A].reset_index(drop=True)

    cumulative_range = 0

    for index, row in subset_df.iterrows():
        Point_B = row['Point_B']
        c_range = row['range']

        cumulative_range += c_range

        cumulative_df = cumulative_df.append({'Point_A': Point_A, 'Point_B': Point_B, 'cumulative_range': cumulative_range}, ignore_index=True)

print(cumulative_df)


有没有人有逻辑或解决方案来解决这个问题?

k4emjkb1

k4emjkb11#

我会使用networkx。一个简单的(但不是最优化的)方法是对任何两个节点之间所有可能路径的权重求和,如果存在这样的路径的话。
很可能有优化的方法来做到这一点。

import networkx as nx

G = nx.DiGraph()
for _, r in df.iterrows():
    G.add_edge(r['Point_A'], r['Point_B'], weight=r['Range'])

# then
result = [
    (a, b, sum([nx.path_weight(G, path, 'weight') for path in paths]))
    for a in G.nodes() for b in G.nodes()
    if (paths := list(nx.all_simple_paths(G, a, b)))
]

>>> result
[(1001400.0, 1001402.0, 9.7),
 (1001400.0, 1001404.0, 29.9),
 (1001400.0, 1001406.0, 45.9),
 (1001400.0, 1001408.0, 67.6),
 ...
 (1001406.0, 1001412.0, 48.4),
 (1001408.0, 1001410.0, 11.1),
 (1001408.0, 1001412.0, 26.7),
 (1001410.0, 1001412.0, 15.6)]

字符串
你当然可以把它放在一个新的df中,你喜欢:

out = pd.DataFrame(result, columns='Point_A Point_B Cumulative_Range'.split())

附录

您还没有指定如果从给定节点到给定节点有多条路径时应该发生什么。您可能有兴趣使用Floyd-Warshall algorithm查找最短(加权)路径:

result = [
    (a, b, w)
    for a, d in nx.floyd_warshall(G, weight='weight').items()
    for b, w in d.items() if 0 < w < np.inf
]

相关问题