如何合并数据帧、合并列和创建新行

问题描述

我有几个与这些结构非常相似的 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

目前我有一段代码可以做类似的事情,但我使用的是字典而不是熊猫数据框(这是我想要使用的)(背后的原因是每个“路线”都有不同的特性使它们彼此独特,所以字典很有用,当时我刚刚学习 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'),how='cross')[['i','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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...