Fed*_*ile 1 python compare dataframe pandas difference
我有两个不同大小的数据帧(df1nad df2).我想从df1存储在其中的所有行中删除df2.
所以如果我df2等于:
A B
0 wer 6
1 tyu 7
Run Code Online (Sandbox Code Playgroud)
并且df1等于:
A B C
0 qwe 5 a
1 wer 6 s
2 wer 6 d
3 rty 9 f
4 tyu 7 g
5 tyu 7 h
6 tyu 7 j
7 iop 1 k
Run Code Online (Sandbox Code Playgroud)
最终结果应如下:
A B C
0 qwe 5 a
1 rty 9 f
2 iop 1 k
Run Code Online (Sandbox Code Playgroud)
我能够通过使用for循环实现我的目标,但我想知道是否有更好,更优雅和有效的方式来执行此类操作.
以下是我在需要时编写的代码:将pandas导入为pd
df1 = pd.DataFrame({'A' : ['qwe', 'wer', 'wer', 'rty', 'tyu', 'tyu', 'tyu', 'iop'],
'B' : [ 5, 6, 6, 9, 7, 7, 7, 1],
'C' : ['a' , 's', 'd', 'f', 'g', 'h', 'j', 'k']})
df2 = pd.DataFrame({'A' : ['wer', 'tyu'],
'B' : [ 6, 7]})
for i, row in df2.iterrows():
df1 = df1[(df1['A']!=row['A']) & (df1['B']!=row['B'])].reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)
小智 10
我发现的最干净的方法是使用要删除的数据帧的索引从 Pandas 中删除:
df1.drop(df2.index, axis=0,inplace=True)
Run Code Online (Sandbox Code Playgroud)
使用merge带有filter by的外连接query,最后删除helper列drop:
df = pd.merge(df1, df2, on=['A','B'], how='outer', indicator=True)
.query("_merge != 'both'")
.drop('_merge', axis=1)
.reset_index(drop=True)
print (df)
A B C
0 qwe 5 a
1 rty 9 f
2 iop 1 k
Run Code Online (Sandbox Code Playgroud)