首页 > 解决方案 > 基于逗号拆分并在 Python 中创建新数据框

问题描述

假设我有以下数据框。

df

Nodes       Weight
A,B          10
A,C,F        8
B,F,D        6
B,E          4

我想根据逗号分割并保持它们的权重。例如,Nodes (A,C,F)A 与 C 有连接,C 有连接 F。所以,我想看看A >>C, 和C>>F。没必要看A>>F。并且它们的重量应为 8,如下所示。

正在寻找的最终数据框如下所示。

Node_1    Node_2     Weight
A            B        10
A            C        8
C            F        8
B            F        6
F            D        6
B            E        4

创建此数据框的目标是从中创建网络图。

有类似的解决方案,但我无法得到我想要的结果。

我尝试了以下方法:

df = (df['Nodes'].str.split(',') .groupby(df['Weight'])

有人可以帮忙吗?

标签: python-3.xpandasnetworkx

解决方案


这是执行此操作的一种方法:

# From https://docs.python.org/3/library/itertools.html#itertools-recipes
from itertools import tee
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

df['Node_pairs'] = df['Nodes'].str.split(',').apply(lambda x: list(pairwise(x)))
df = df.explode('Node_pairs')
df['Node1'] = df['Node_pairs'].str[0]
df['Node2'] = df['Node_pairs'].str[1]
df

输出:

   Nodes  Weight Node_pairs Node1 Node2
0    A,B      10     (A, B)     A     B
1  A,C,F       8     (A, C)     A     C
1  A,C,F       8     (C, F)     C     F
2  B,F,D       6     (B, F)     B     F
2  B,F,D       6     (F, D)     F     D
3    B,E       4     (B, E)     B     E

细节:

  • 使用 itertools 文档中的成对配方创建“Node_pairs”
  • 展开“Node_pairs”列表中的数据框
  • 使用 .str get 快捷方式分配“Node1”和“Node2”。

推荐阅读