我正在尝试根据列属性获取两个数据框的补码。
pd.merge可以取交集,但是有没有一种简单的方法就可以在不创建/改组更多数据帧的情况下获得赞美呢?
有人在这里用一种创建/改组更多数据帧的方法回答了这个问题(how to find the complement of two dataframes),但是我想知道是否存在一种更直接的方法来实现此功能。
答案 0 :(得分:1)
您可以在两个数据帧上进行外部合并,将指示符设置为List<Map> combineList = titleList.stream().flatMap(titleMap ->
codeList.stream().filter( codeMap -> titleMap.get("ID").equals(codeMap.get("ID"))).map( codeMap ->{
Map<String, Object> tempMap = new HashMap<>();
tempMap.put("ID", titleMap.get("ID"));
tempMap.put("NAME", titleMap.get("NAME"));
tempMap.put("ID", codeMap.get("ID"));
tempMap.put("AGE", codeMap.get("AGE"));
return tempMap;
})
).collect(Collectors.toList());
。然后根据True
列对数据进行子集处理:
_merge
示例:
combined = df1.merge(df2, on='col1', how='outer', indicator=True)
combined[combined._merge != 'both']
答案 1 :(得分:0)
您可以使用MultiIndexing
并消除公用索引和append
:
df1.set_index(['key1', 'key2'], inplace=True)
df2.set_index(['key1', 'key2'], inplace=True)
df = df1[~df1.index.isin(df2.index)].append(df2[~df2.index.isin(df1.index)], sort=False)\
.reset_index()
print(df)
key1 key2 A B C D
0 K0 K1 A1 B1 NaN NaN
1 K2 K1 A3 B3 NaN NaN
2 K2 K0 NaN NaN C3 D3