我有两个熊猫数据帧,它们有一些相同的行。

假设dataframe2是dataframe1的子集。

我怎么能得到dataframe1的行不在dataframe2?

df1 = pandas.DataFrame(data = {'col1' : [1, 2, 3, 4, 5], 'col2' : [10, 11, 12, 13, 14]}) 
df2 = pandas.DataFrame(data = {'col1' : [1, 2, 3], 'col2' : [10, 11, 12]})

df1

   col1  col2
0     1    10
1     2    11
2     3    12
3     4    13
4     5    14

df2

   col1  col2
0     1    10
1     2    11
2     3    12

预期结果:

   col1  col2
3     4    13
4     5    14

当前回答

pd。concat([df1, df2]).drop_duplicate (keep=False)将两个dataframe连接在一起,然后删除所有重复的数据,只保留唯一的行。默认情况下,它将保留第一次出现的副本,但设置keep=False将删除所有副本。

请记住,如果您需要比较具有不同名称的列的dataframe,那么在连接数据aframe之前,必须确保列具有相同的名称。

此外,如果数据框架的列顺序不同,也会影响最终结果。

其他回答

有点晚了,但可能值得检查pd.merge的“indicator”参数。

请看另一个问题的例子: 比较PandaS数据框架并返回第一个数据框架中缺少的行

我这样做的方法包括添加一个新的列,该列对一个数据框架是唯一的,并使用它来选择是否保留一个条目

df2[col3] = 1
df1 = pd.merge(df_1, df_2, on=['field_x', 'field_y'], how = 'outer')
df1['Empt'].fillna(0, inplace=True)

这使得df1中的每个条目都有一个代码-如果它对df1是唯一的,则为0,如果它在两个数据框架中都是1。然后使用它来限制您想要的内容

answer = nonuni[nonuni['Empt'] == 0]

我认为那些包含合并的答案是极其缓慢的。因此,我建议另一种方法来获得两个数据框架之间不同的行:

df1 = pandas.DataFrame(data = {'col1' : [1, 2, 3, 4, 5], 'col2' : [10, 11, 12, 13, 14]}) 
df2 = pandas.DataFrame(data = {'col1' : [1, 2, 3], 'col2' : [10, 11, 12]})

免责声明:如果您对两个数据框架不同的特定列感兴趣,那么我的解决方案是有效的。如果您只对那些所有列都相等的行感兴趣,则不要使用这种方法。

比方说,col1是一种ID,你只想获取那些不包含在两个数据框架中的行:

ids_in_df2 = df2.col1.unique()
not_found_ids = df[~df['col1'].isin(ids_in_df2 )]

就是这样。你得到的数据框架只包含那些col1在两个数据框架中都不明显的行。

假设索引在数据帧中是一致的(不考虑实际的col值):

df1[~df1.index.isin(df2.index)]

我有一个简单的2步更简单的方法: 如OP所述,假设dataframe2是dataframe1的子集,两个dataframe中的列是相同的,

df1 = pd.DataFrame(data = {'col1' : [1, 2, 3, 4, 5, 3], 
                           'col2' : [10, 11, 12, 13, 14, 10]}) 
df2 = pd.DataFrame(data = {'col1' : [1, 2, 3],
                           'col2' : [10, 11, 12]})

### Step 1: just append the 2nd df at the end of the 1st df 
df_both = df1.append(df2)

### Step 2: drop rows which contain duplicates, Drop all duplicates.
df_dif = df_both.drop_duplicates(keep=False)

## mission accompliched!
df_dif
Out[20]: 
   col1  col2
3     4    13
4     5    14
5     3    10