【问题标题】:Join or Merge dataframes with different multi-indexes加入或合并具有不同多索引的数据帧
【发布时间】:2020-10-31 11:49:51
【问题描述】:

为重复的问题提前道歉,但我还没有找到可以解决之前问题的解决方案。

我无法连接具有不同 MultiIndex 的两个数据框。我想保留两个数据框中的所有列。

鉴于 df1 有约 300k 行,而 df2 有约 50k 行,则 df1:df2 之间的连接将是 many:1。

df1                  B  path_id
cust_id date                   
11      2015-02-24  10       13
28      2015-02-25  16       22
23      2015-02-26  21       19
15      2015-02-27  11       28
18      2015-02-28  29       10


df2               C
cust_id path_id    
11      13       10
28      22       26
23      19       22
15      28       27
18      10       18

目标是将列C 分配给索引cust_id 和列path_id 的所有匹配组合。请参阅下面的 df3 作为示例。

df3                     B   C  path_id
cust_id date                       
11      2015-02-24  10  10       13
28      2015-02-25  16  26       22
23      2015-02-26  21  22       19
15      2015-02-27  11  27       28
18      2015-02-28  29  18       10

感谢对此的任何回应。谢谢!

【问题讨论】:

  • 如果你用你的结构创建了一些虚拟数据框,然后显示预期的输出,这将有很大帮助。 stackoverflow.com/questions/20109391/…
  • 感谢您的建议。我已经更新了帖子。
  • 由于您的索引级别似乎有名称,您可以在“cust_id”上使用更多。试试df1.merge(df2, on=['cust_id','path_id'])

标签: python pandas dataframe multi-index


【解决方案1】:

根据我对您的问题的理解,这两个选项可以帮助您。

  1. 以下代码将基于两个索引(即 cust_id 和 path_id)执行完整(内部)合并,并将其余数据存储为数据帧的列。
df3 = pd.merge(df1, df2,on=["cust_id", "path_id"])
  1. 以下代码将执行上述操作,并将列 (cust_id) 设为新数据帧的索引。
df3 = pd.merge(df1, df2,on=["cust_id", "path_id"]).set_index('cust_id')

【讨论】:

    【解决方案2】:

    试试:

    df1.reset_index('date').merge(df2, on=['cust_id','path_id'])
    

    输出:

                   date   b  path_id   c
    cust_id                             
    11       2015-02-24  10       13  10
    28       2015-02-25  16       22  26
    23       2015-02-26  21       19  22
    15       2015-02-27  11       28  27
    18       2015-02-28  29       10  18
    

    【讨论】:

    • 谢谢。我相信我的公司正在使用旧版本的熊猫,我无法加入索引。当我尝试将索引标签放入连接数组时,它返回该列不存在。
    • @W.Powell 我记得这是旧版熊猫的问题。出于好奇,您对哪个版本的熊猫感到好奇?
    • pd.__version__ = 0.25.1
    【解决方案3】:

    嗯,我想通了。我不确定这是否是最好的方法,但我只是重置了两个数据框的索引并合并到列上。请参阅下面的代码。

    df1.reset_index()
    df2.reset_index()
    df3 = df1.merge(df2, on=['cust_id', 'path_id'])
    

    然后我重新分配了索引。如果有更好的方法请告诉我。

    谢谢!

    【讨论】:

    • 是的。这是一种方法。我在下面发布了一个解决方案,您不必在两个数据帧上都执行两个索引级别。
    猜你喜欢
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2015-06-21
    • 2015-02-10
    相关资源
    最近更新 更多