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