如何从Pandas数据帧中提取不在子集数据帧中的行

4
我有两个数据框,一个是DF,另一个是SubDFSubDFDF的子集。我想提取DF中不在SubDF中的行。
我尝试了以下方法:
DF2 = DF[~DF.isin(SubDF)]

行数是正确的,大部分行也是正确的,

subDF中的行数加上DF2中的行数等于DF中的行数

但我得到了一些带有NaN值的行,这些行在原始的DF中不存在。

不确定我做错了什么。

注意:原始的DF没有任何NaN值,并且为了双重检查,我执行了DF.dropna(),结果仍然产生了NaN

2个回答

4
你需要使用外连接布尔索引进行合并,因为DataFrame.isin需要匹配索引
DF = pd.DataFrame({'A':[1,2,3],
                   'B':[4,5,6],
                   'C':[7,8,9],
                   'D':[1,3,5],
                   'E':[5,3,6],
                   'F':[7,4,3]})

print (DF)
   A  B  C  D  E  F
0  1  4  7  1  5  7
1  2  5  8  3  3  4
2  3  6  9  5  6  3

SubDF = pd.DataFrame({'A':[3],
                   'B':[6],
                   'C':[9],
                   'D':[5],
                   'E':[6],
                   'F':[3]})

print (SubDF)
   A  B  C  D  E  F
0  3  6  9  5  6  3

#return no match
DF2 = DF[~DF.isin(SubDF)]
print (DF2)
   A  B  C  D  E  F
0  1  4  7  1  5  7
1  2  5  8  3  3  4
2  3  6  9  5  6  3

DF2 = pd.merge(DF, SubDF, how='outer', indicator=True)
DF2 = DF2[DF2._merge == 'left_only'].drop('_merge', axis=1)
print (DF2)
   A  B  C  D  E  F
0  1  4  7  1  5  7
1  2  5  8  3  3  4

2

另一种方法是借鉴 @jezrael 的设置:


df = pd.DataFrame({'A':[1,2,3],
                   'B':[4,5,6],
                   'C':[7,8,9],
                   'D':[1,3,5],
                   'E':[5,3,6],
                   'F':[7,4,3]})

sub = pd.DataFrame({'A':[3],
                    'B':[6],
                    'C':[9],
                    'D':[5],
                    'E':[6],
                    'F':[3]})

extract_idx = list(set(df.index) - set(sub.index))
df_extract = df.loc[extract_idx]

行可能不按照原始df顺序排序。如果需要匹配顺序:

extract_idx = list(set(df.index) - set(sub.index))
idx_dict = dict(enumerate(df.index))
order_dict = dict(zip(idx_dict.values(), idx_dict.keys()))
df_extract = df.loc[sorted(extract_idx, key=order_dict.get)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接