如何基于多索引映射将列添加到DataFrame

时间:2017-04-23 06:44:30

标签: python pandas dataframe

我有一个数据框df,如下所示:

# df.head(10)
          TYPE               A                  B  
0            0               5                 25     
1            1               7                 23     
2            5              10                 43     
3            1               5                 37     
4            2               4                 61     
5            3               1                 17   
6            0               8                 39     
7            2               4                 59  
8            4               2                  6  
9            0               3                 31  

我有一个多索引地图mapp,如下所示:

# mapp.head(10)
                  num  
AA      BB             
1        1          1 
         4          2 
         5          3 
        10          4 
        17          5 
        18          6 
2        3          7
         6          8
         9          9
3        3         10

我想像这样添加一个df['num']列:

          TYPE               A                  B           num
0            0               5                 25            74
1            1               7                 23            89
2            5              10                 43           129
3            1               5                 37            77
4            2               4                 61            62
5            3               1                 17             5
6            0               8                 39            98
7            2               4                 59            61
8            4               2                  6             8
9            0               3                 31            40

我尝试使用以下代码实现它:

idx = df.set_index(['A', 'B']).index
df['num'] = mapp.loc[idx, 'num']

但是Python抛出异常:

Exception: cannot handle a non-unique multi-index!

我该如何解决?或者还有其他方法可以解决这个问题吗?此外,df的大小非常大,我不想使用循环。

1 个答案:

答案 0 :(得分:2)

使用DataFrame.join

df1 = df.join(mapp, on=['A','B'])
print (df1)
   TYPE   A   B  num
0     0   5  25  NaN
1     1   7  23  NaN
2     5  10  43  NaN
3     1   5  37  NaN
4     2   4  61  NaN
5     3   1  17  5.0
6     0   8  39  NaN
7     2   4  59  NaN
8     4   2   6  8.0
9     0   3  31  NaN