熊猫离开了外部联盟

时间:2017-06-20 17:59:20

标签: python pandas left-join

我有2个pandas数据帧

bool doLoop = true;
while (doLoop)
{
    doLoop = !calculate()
}

DF1

df1 = pd.DataFrame(data = {'col1' : ['finance', 'finance', 'finance', 'accounting', 'IT'], 'col2' : ['az', 'bh', '', '', '']}) 
df2 = pd.DataFrame(data = {'col1' : ['finance', 'finance', 'finance', 'finance', 'finance'], 'col2' : ['', 'az', '', '', '']})

DF2

    col1    col2
0   finance az
1   finance bh
2   finance 
3   accounting  
4   IT  

正如您所看到的,数据框也有空白值。我尝试使用example并且没有给我我想要的结果。

    col1    col2
0   finance 
1   finance az
2   finance 
3   finance 
4   finance 

我希望输出类似

common = df1.merge(df2,on=['col1','col2'])
df3=df1[(~df1.col1.isin(common.col1))&(~df1.col2.isin(common.col2))]

3 个答案:

答案 0 :(得分:2)

通过设置pandas merge's indicator = True可以排除大熊猫左外连接。然后按_merge列中的指标进行过滤。

df=pd.merge(df1,df2[['col1']],on=['col1'],how="outer",indicator=True)
df=df[df['_merge']=='left_only']
# this following line is just formating
df = df.reset_index()[['col1', 'col2']] 

输出:

col1    col2
0   accounting  
1   IT  

=================================

====下面是显示机制的示例====

df1 = pd.DataFrame({'key1': ['0', '1'],
                     'key2': [-1, -1],
                     'A': ['A0', 'A1'],
                     })


df2 = pd.DataFrame({'key1': ['0', '1'],
                      'key2': [1, -1], 
                    'B': ['B0', 'B1']
                     })

df1

输出:

    A   key1    key2
0   A0  0       -1
1   A1  1       -1

df2

输出:

    B   key1    key2
0   B0  0       1
1   B1  1       -1

df=pd.merge(df1,df2,on=['key1','key2'],how="outer",indicator=True)

输出:

     A  key1    key2    B   _merge
0   A0  0   -1  NaN left_only
1   A1  1   -1  B1  both
2   NaN 0   1   B0  right_only

:在_merge列中带有以上指示符。您可以选择一个数据框中的行,但不能选择另一个。

df=df[df['_merge']=='left_only']
df

输出:

    A   key1    key2    B   _merge
0   A0  0   -1  NaN left_only

答案 1 :(得分:0)

此操作失败,因为您要在col1&中独立检查匹配项col2,并在两者之间排除匹配。空字符串与finance行中的空字符串匹配。

你想要:

df3 = df1[(~df1.col1.isin(common.col1))|(~df1.col2.isin(common.col2))]
df3
Out[150]: 
         col1 col2
1     finance   bh
3  accounting     
4          IT  

要使df1中的行不在df2

明确具体

df3
    col1    col2
3   accounting  
4   IT  

您可以尝试选择不匹配的col1

df3 = df1[~df1.col1.isin(df2.col1)]
df3
Out[172]: 
         col1 col2
3  accounting     
4          IT

要在col1&中独立检查匹配项col2并在NaN比较不等/永不算作匹配时排除匹配,您可以使用

df3 = df1[(~df1.col1.isin(common.col1)|df1.col1.isnull())&(~df1.col2.isin(common.col2)|df1.col2.isnull())]
df3
Out[439]: 
         col1 col2
3  accounting  NaN
4          IT  NaN

假设您在实际数据中使用实际的NaN Nonenp.nan,而不是像本例中那样使用空字符串。如果是后者,则需要添加

df1.replace('', np.nan, inplace=True)
df2.replace('', np.nan, inplace=True)

第一

答案 2 :(得分:0)

根据 Bin 的回答,针对此的一个班轮可能是:

df=pd.merge(df1,df2[['col1']],on=['col1'],how="outer",indicator=True).query('_merge=="left_only"')