我有两个数据帧,并且试图比较两个数据帧,因此如果df1的值在df中,则删除该行。我列出了这两列,它们的名称完全相同。
df Permit Number Sub Permit
BLD-00045 NaN
ELE-2019 BLD-00045
PLM-2018 BLD-00045
df1 Permit Number Sub Permit
BLD-00001 NaN
ELE-2019 BLD-00045
PLM-7777 BLD-00045
在下面的代码中,我将列重命名为另一个数据框(df3),以便可以将其合并为新的数据框(df1)。我试图将索引设置为许可值,但不希望删除索引(因为我想保留许可号),然后进行比较。
我的目标是保留BLD-00045和PLM-2018行,但删除ELE-2019行,因为这两个数据帧之间相等。
df3.rename(columns={'permit_num': "Permit Number"}, inplace=True)
df1 = pd.merge(df, df3, on='Permit Number')
df.set_index('Permit Number', inplace=False)
df1.set_index('Permit Number', inplace=False)
df = df.loc[df['Permit Number'] != df1['Permit Number']]
print(df)
我不断收到ValueError:只能比较标记相同的Series对象。
答案 0 :(得分:1)
一种方法是将isin
与~
结合使用以反转逻辑,
例如:
print(df.loc[df['Permit Number'].isin(df1['Permit Number'])])
Permit Number Sub Permit
1 ELE-2019 BLD-00045
如果我正确理解了您的逻辑,则要删除上面的行^
print(df.loc[~df['Permit Number'].isin(df1['Permit Number'])])
您可以通过添加~
来做到这一点,它可以颠倒逻辑或充当not isin
。
Permit Number Sub Permit
0 BLD-00045 NaN
2 PLM-2018 BLD-00045
答案 1 :(得分:0)
df2 = df.merge(df1, how='outer', indicator=True)
df3 = df2[df2['_merge']=='left_only'].drop(labels='_merge', axis=1)
IIUC,您只需要df中存在的行,而无需df1中的行。