我有两个数据帧。 DF
和SubDF
。 SubDF
是DF
的子集。我想提取DF
中不在SubDF
中的行。
我尝试了以下内容:
DF2 = DF[~DF.isin(SubDF)]
行数正确且大多数行都正确,
即subDF
中的行数+ DF2
中的行数= DF
中的行数
但是我的行NaN
DF
个值
不确定我做错了什么。
注意:原始DF
没有任何NaN
值,要仔细检查我之前DF.dropna()
,结果仍然生成NaN
答案 0 :(得分:2)
merge
和boolean indexing
需要outer join
,因为DataFrame.isin
需要values
和index
匹配:
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
答案 1 :(得分:1)
另一种方式,借用@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)]