熊猫在忽略NaN的多个列上合并

时间:2019-07-25 11:40:07

标签: python pandas

我试图做与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可能来自c1c2,但在此示例中,我将其简化了。

我不确定执行此操作最干净的方法是什么。我当时正在考虑基于[c1,c2]进行合并,然后使用nan逐行循环,但这并不是那么直接。您看到更好的方法了吗?

编辑-阐明条件
1.在任何地方都找不到重复项。
2.如果两行都有值,则在两行之间不执行任何组合。 c1不能与c2结合使用,因此必须遵守顺序。
3.对于2个df之一在nanc1中具有c2的情况,请在另一个数据框中查找在两个{ {1}} + c1,然后使用它。例如:

  • c2两者都匹配,因此不再讨论。
  • (a,c)仅在(a,b)中。在df1中找不到bdf2.c2中唯一具有已知密钥和df2的行是nan行,因此将其与该行合并。请注意,必须遵守顺序,这就是0无法与也包含(a,b) #df1的{​​{1}}的任何其他行组合的原因。
  • df2仅在b中。在(a,x)中找不到df2x中唯一带有df1.c2的已知键之一的行是索引为df1的行。

0 个答案:

没有答案