成对重塑数据框
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
我正在尝试从代表每个节点一条边的两列数据框中构建图边列表。
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 |