我试图做与this answer相同的操作,但有区别,在某些情况下,我想忽略NaN
。例如:
#df1
c1 c2 c3
0 a b 1
1 a c 2
2 a nan 1
3 b nan 3
4 c d 1
5 d e 3
#df2
c1 c2 c4
0 a nan 1
1 a c 2
2 a x 1
3 b nan 3
4 z y 2
#merged output based on [c1, c2], dropping instances
#with `NaN` unless both dataframes have `NaN`.
c1 c2 c3 c4
0 a b 1 1 #c1,c2 from df1 because df2 has a nan in c2
1 a c 2 2 #in both
2 a x 1 1 #c1,c2 from df2 because df1 has a nan in c2
3 b nan 3 3 #c1,c2 as found in both
4 c d 1 nan #from df1
5 d e 3 nan #from df1
6 z y nan 2 #from df2
NaN
可能来自c1
或c2
,但在此示例中,我将其简化了。
我不确定执行此操作最干净的方法是什么。我当时正在考虑基于[c1,c2]
进行合并,然后使用nan逐行循环,但这并不是那么直接。您看到更好的方法了吗?
编辑-阐明条件
1.在任何地方都找不到重复项。
2.如果两行都有值,则在两行之间不执行任何组合。 c1
不能与c2
结合使用,因此必须遵守顺序。
3.对于2个df之一在nan
或c1
中具有c2
的情况,请在另一个数据框中查找在两个{ {1}} + c1
,然后使用它。例如:
c2
两者都匹配,因此不再讨论。 (a,c)
仅在(a,b)
中。在df1
中找不到b
。 df2.c2
中唯一具有已知密钥和df2
的行是nan
行,因此将其与该行合并。请注意,必须遵守顺序,这就是0
无法与也包含(a,b) #df1
的{{1}}的任何其他行组合的原因。df2
仅在b
中。在(a,x)
中找不到df2
。 x
中唯一带有df1.c2
的已知键之一的行是索引为df1
的行。