【问题标题】:How to merge DataFrames, combining columns and creating new rows如何合并 DataFrame、合并列和创建新行
【发布时间】:2023-03-19 09:01:02
【问题描述】:

我有几个与这些结构非常相似的弧数据帧:

Ah:
i j
0 1 1
1 1 2
2 2 1
3 2 2
K:
Ok Dk
0 3 4
1 1 2
2 2 1

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

Route:
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

或者这个结构:

Route:
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

目前我有一段代码可以做类似的事情,但我使用的是字典而不是 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]

【问题讨论】:

  • 您能否澄清“需要删除!”您是说该行不应该在结果框架中,还是您实际上是在寻找一个包含“需要删除!”字样的指示列? TLDR;您能否阐明您的预期输出是究竟应该如何显示?
  • 我删除了“需要删除”注释以避免混淆,我的输出应该是上面两个“路由”结构中的任何一个

标签: python pandas dataframe merge cartesian-product


【解决方案1】:

第一个使用交叉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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢!这实际上接近我所需要的
    猜你喜欢
    • 1970-01-01
    • 2016-01-17
    • 2018-09-07
    • 2023-02-14
    • 2014-12-03
    • 1970-01-01
    • 2019-08-12
    • 2021-04-10
    相关资源
    最近更新 更多