如何合并 DataFrame、合并列和创建新行

How to merge DataFrames, combining columns and creating new rows

我有几个 arcs 数据帧,它们的结构与这些非常相似:

啊:
j
0 1 1
1 1 2
2 2 1
3 2 2
K:
好的 Dk
0 3 4
1 1 2
2 2 1

我需要找到一种方法来创建一个合并两者的新数据框,遵循以下结构:

路线:
好的 j Dk
0 3 1 1 4
1 3 1 2 4
2 3 2 1 4
3 3 2 2 4
4 1 1 1 2
5 1 1 2 2
6 1 2 1 2
7 1 2 2 2
8 2 1 1 1
9 2 1 2 1
10 2 2 1 1
11 2 2 2 1

或者这个结构:

路线:
j k
0 1 1 0
1 1 2 0
2 2 1 0
3 2 2 0
4 1 1 1
5 1 2 1
6 2 1 1
7 2 2 1
8 1 1 2
9 1 2 2
10 2 1 2
11 2 2 2

目前我有一段代码可以做类似的事情但是我使用的不是 pandas 数据框(这是我想要使用的)字典(背后的原因是每条“路线”都有不同的特点,使它们彼此独一无二,所以字典很有用,当时我刚刚学习 Python) 但问题是它需要太多时间并占用大量内存所以我试图找到一种方法让它更快一点,避免 'for' 循环并尝试应用 Pandas 来创建合并的数据框。

这是我当前代码段结构的摘录,对于此示例,将 'A' 数据框视为包含弧的所有可能组合的数据框,因此 'if' 条件使得确保在创建路由之前存在连接。

routes = {}
for k in K:
    for (i,j) in Ah:
        if (Ok,i) in A and (j,Dk) in A:
            routes[i,j,k] = [Here goes a lot of caracteristics of the route]

我认为您可以使用 pandas Concat 函数以您想要的方式合并词典。 https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html

很难看出您希望如何布局,但我认为您想使用 .merge

第一个使用交叉merge

df3 = pd.merge(df2, df1, how='cross')[['Ok', 'i', 'j', 'Dk']]

df3:

    Ok  i  j  Dk
0    3  1  1   4
1    3  1  2   4
2    3  2  1   4
3    3  2  2   4
4    1  1  1   2
5    1  1  2   2
6    1  2  1   2
7    1  2  2   2
8    2  1  1   1
9    2  1  2   1
10   2  2  1   1
11   2  2  2   1

与第二个索引交叉合并:

df4 = pd.merge(df2.index.to_frame(name='k'), df1, how='cross')[['i', 'j', 'k']]

df4:

    i  j  k
0   1  1  0
1   1  2  0
2   2  1  0
3   2  2  0
4   1  1  1
5   1  2  1
6   2  1  1
7   2  2  1
8   1  1  2
9   1  2  2
10  2  1  2
11  2  2  2