比较两个数据框时出现错误,列名相同

时间:2019-11-08 23:00:58

标签: python pandas

我有两个数据帧,并且试图比较两个数据帧,因此如果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对象。

2 个答案:

答案 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中的行。