我有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))]
答案 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
None
或np.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"')