Python 3.x 基于逗号拆分并在Python中创建新数据帧

Python 3.x 基于逗号拆分并在Python中创建新数据帧,python-3.x,pandas,networkx,Python 3.x,Pandas,Networkx,假设我有以下数据帧 df 我想分割的基础上逗号和保持其重量以及。例如,节点(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

假设我有以下数据帧

df

我想分割的基础上逗号和保持其重量以及。例如,
节点(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'])


有人能帮忙吗?

这里有一种方法:

# 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文档中的成对配方创建 “节点对”
  • 分解“节点对”列表上的数据帧
  • 使用.str get快捷方式分配“Node1”和“Node2”

逻辑与Scott提供的解决方案相同

def grouper(input_list, n = 2):
    for i in range(len(input_list) - (n - 1)):
        yield input_list[i:i+n]
        
(df.set_index('Weight')['Nodes']
   .str.split(',')
   .map(grouper)
   .map(list)
   .explode()
   .apply(pd.Series).add_prefix('Node_')
   .reset_index())

仅供参考,itertools中也有一个。
def grouper(input_list, n = 2):
    for i in range(len(input_list) - (n - 1)):
        yield input_list[i:i+n]
        
(df.set_index('Weight')['Nodes']
   .str.split(',')
   .map(grouper)
   .map(list)
   .explode()
   .apply(pd.Series).add_prefix('Node_')
   .reset_index())
    Weight  Node_0  Node_1
0   10      A       B
1   8       A       C
2   8       C       F
3   6       B       F
4   6       F       D
5   4       B       E