我有两个大小不相等的多索引数据框,我想比较

时间:2019-08-29 16:45:21

标签: python pandas

我有两个形状相似但大小不同的多索引数据帧(df1和df2)。

我希望比较两个数据框的列,并在较大数据框的支架上进行比较,并在不匹配的行中显示空白。 -df1:

               col1
one two three      
a   1.0 abc       1
        mno       2
        xyz       3
    2.0 abc       4
        mno       5
        xyz       6
b   1.0 abc       7
        mno       8
        xyz       9
    2.0 abc      10
        mno      11
        xyz      12
  • df2:
                0
one two three    
a   1.0 abc    18
        mno    18
        xyz    19
        lpq    18
    2.0 abc     7
        mno     4
        xyz    13
        lpq     8
b   1.0 abc     8
        mno     5
        xyz     4
        lpq    14
    2.0 abc    12
        mno    16
        xyz     6
        lpq     7
c   1.0 abc     5
        mno     0
        xyz     0
        lpq    19
    2.0 abc    14
        mno     7
        xyz     0
        lpq     6

我已经尝试使用简单的差异比较两个数据框,希望第三个数据框包含不匹配的空行,但是我最终得到了一个更大的数据框,其中包含同一行的倍数和许多空范围行。

要重新创建dfs

import pandas as pd
import numpy as np


index_1 = pd.MultiIndex.from_product([['a','b'],[1.,2],['abc','mno','xyz']], names = ['one','two','three'])
df1 =  pd.DataFrame({'col1':[1,2,3,4,5,6,7,8,9,10,11,12]}, index = index_1)



index_2 = pd.MultiIndex.from_product([['a','b','c'],[1.,2],['abc','mno','xyz', 'lpq']], names = ['one','two','three'])
df2 =  pd.DataFrame(np.random.randint(0,20,size=(24, 1)), index = index_2)


我想要的数据框应该看起来像更大的df:

                0
one two three    
a   1.0 abc    18
        mno    18
        xyz    19
        lpq     
    2.0 abc     7
        mno     4
        xyz    13
        lpq      
b   1.0 abc     8
        mno     5
        xyz     4
        lpq     
    2.0 abc    12
        mno    16
        xyz     6
        lpq      
c   1.0 abc     5
        mno     0
        xyz     0
        lpq     
    2.0 abc    14
        mno     7
        xyz     0
        lpq      

这个问题困扰了我好几天,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

where + isin

df2.where(pd.Series(df2.index.isin(df1.index), 
                    index=df2.index))

另一种方法是两次reindex(如果索引是唯一的):

df2.reindex(df1.index).reindex(df2.index)

                0
one two three      
a   1.0 abc    11.0
        mno     5.0
        xyz     8.0
        lpq     NaN
    2.0 abc     5.0
        mno     2.0
        xyz    19.0
        lpq     NaN
b   1.0 abc     5.0
        mno    19.0
        xyz    11.0
        lpq     NaN
    2.0 abc     2.0
        mno    13.0
        xyz    12.0
        lpq     NaN

您可以将NaN替换为空白,但我不建议您这样做,因为该列变为object