Python 使用不同的多索引连接或合并数据帧

Python 使用不同的多索引连接或合并数据帧,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,对于重复的问题,我提前表示歉意,但我还没有找到一个与前面问题相同的解决方案 我无法使用不同的多索引连接两个数据帧。我想保留两个数据帧中的所有列 假设df1有大约300k行,而df2有大约50k行,那么df1:df2之间的连接将是多:1 df1 B path_id cust_id date 11 2015-02-24 10 13 28 2015-02-25 16 22 23

对于重复的问题,我提前表示歉意,但我还没有找到一个与前面问题相同的解决方案

我无法使用不同的多索引连接两个数据帧。我想保留两个数据帧中的所有列

假设df1有大约300k行,而df2有大约50k行,那么df1:df2之间的连接将是多: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\u id
和列
path\u 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

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

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

df1.reset_index()
df2.reset_index()
df3 = df1.merge(df2, on=['cust_id', 'path_id'])
然后我重新分配了索引。如果有更好的办法,请告诉我

谢谢

试试看:

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
根据我对你的问题的理解,以下两个选项可以帮助你

  • 以下代码将基于两个索引(即cust_id和path_id)执行完全(内部)合并,并将其余数据存储为数据帧的列
  • 以下代码将执行上述操作,并将列(cust_id)作为新数据帧的索引

  • 如果您用您的结构创建了一些虚拟数据帧,然后还显示了预期的输出,这将非常有帮助。谢谢你的建议。我已经更新了帖子。因为你的索引级别似乎有名字,你可以在“客户id”上使用更多。尝试
    df1.merge(df2,on=['cust\u id','path\u id'])
    yes。这是一种方法。我在下面发布了一个解决方案,您不必在两个数据帧上都执行索引级别。谢谢。我相信我的公司使用的是熊猫的旧版本,我不能加入索引。当我尝试将索引标签放入联接数组时,它返回的结果是该列不存在。@W.Powell我确实记得这是旧版本pandas的一个问题。出于好奇,你正在运行什么版本的熊猫?pd.\uuuuuuu版本\uuuuuu=0.25.1
    df3 = pd.merge(df1, df2,on=["cust_id", "path_id"])
    
    df3 = pd.merge(df1, df2,on=["cust_id", "path_id"]).set_index('cust_id')