【问题标题】:Concatinating multiindex dataframe with non-unique multiindex将多索引数据帧与非唯一多索引连接
【发布时间】:2020-10-21 15:47:29
【问题描述】:

我有一个数据框 dfa:

               y   X1  X2  X3
Company Period
1       1      1   2   3   4
        2      3   4   5   6
        3      3   6   5   6
2       1      1   2   3   4
        2      3   4   5   6
        3      7   8   9  10
... 

和 dfb

Company Period
1       1      
        2      
        3      
7       1      
        2      
        3    
1       1      
        2      
        3        
... 

如您所见,dfb 有一个非唯一的多索引。我想以一种可以处理非唯一性的方式连接两个 dfs,并将 dfa 的值添加到索引相等的任何地方的 dfb 中。所以想要的结果应该是这样的:

               y   X1  X2  X3
Company Period
1       1      1   2   3   4
        2      3   4   5   6
        3      3   6   5   6
7       1      1   2   3   4    
        2      1   5   5   6
        3      1   6   8   9
1       1      1   2   3   4
        2      3   4   5   6
        3      3   6   5   6
... 

我尝试了以下方法:

dfb.join(dfa, how='left') #results in dfb
dfb = pd.concat([dfb, dfa],  axis = 1, join = 'inner') #raises: ValueError: cannot handle a non-unique multi-index!
bs_df.merge(dfa.reset_index(), left_on=['Company', 'PeriodQ'], right_on=['Company', 'PeriodQ'], how='left') #results in dfb

我做错了什么?

我看到了类似的问题here,但解决方案对我不起作用

【问题讨论】:

  • dfb 是一个 DataFrame 还是一个 Multiindex?在后一种情况下,您不必加入,但dfa.loc[dfb, :] 应该可以解决问题。
  • 这是一个数据框,但我可以只使用多索引。但是您的解决方案是否会导致多次出现例如在我上面的例子中 id 1?
  • 我刚刚尝试了您的方法,它似乎可以正常工作。谢谢!你想创建一个答案而不是我将其标记为正确的答案

标签: python pandas dataframe concatenation multi-index


【解决方案1】:

您也可以使用重复索引重新索引 DataFrame,它只会重复相应的行。

In [11]: df = pd.DataFrame([[1,2,3], [4,5,6], [7,8,9]], columns=['X', 'Y', 'Z'], index=pd.MultiIndex.from_product([[1], [1,2,3]]))                                                                                                                                                                                                                                                                      
Out[12]: 
     X  Y  Z
1 1  1  2  3
  2  4  5  6
  3  7  8  9
In [15]: df.loc[pd.MultiIndex.from_product([[1], [1,2,1,2]]), :]                                                                                                                                           
Out[15]: 
     X  Y  Z
1 1  1  2  3
  2  4  5  6
  1  1  2  3
  2  4  5  6

【讨论】:

  • 我的荣幸 :) )
猜你喜欢
  • 2021-01-12
  • 2017-09-04
  • 2018-09-22
  • 2018-06-24
  • 2023-03-08
  • 2015-06-21
  • 2022-12-17
  • 2020-12-21
相关资源
最近更新 更多