成对重塑数据框

Pairwise reshaping dataframe

我正在尝试从代表每个节点一条边的两列数据框中构建图边列表。

pd.DataFrame({'node': ['100',  '100', '200',  '200', '200'],
  'edge': ['111111',  '222222', '123456', '456789',  '987654']})

结果应该是这样的

pd.DataFrame({'node': ['100', '100','200',  '200', '200', '200', '200', '200'],
            'edge1': ['111111','222222','123456', '123456',  '456789', '456789', '987654', '987654'],
            'edge2': ['222222', '111111','456789', '987654',  '987654', '123456' , '123456','456789']})

我一直在与 pivot table 和堆栈搏斗一段时间但没有成功。

你可以使用itertools.permutations得到groupby之后边的排列,然后将输出转换为新的df以生成所需的输出:

import pandas as pd
from itertools import permutations

df = pd.DataFrame({'node': ['100',  '100', '200',  '200', '200'],'edge': ['111111',  '222222', '123456', '456789',  '987654']})

df = df.groupby('node')['edge'].apply(list).apply(lambda x:list(permutations(x, 2))).reset_index().explode('edge')
pd.DataFrame(df["edge"].to_list(), index=df['node'], columns=['edge1', 'edge2']).reset_index()

结果:

node edge1 edge2
0 100 111111 222222
1 100 222222 111111
2 200 123456 456789
3 200 123456 987654
4 200 456789 123456
5 200 456789 987654
6 200 987654 123456
7 200 987654 456789