python-仅当所有多列的值都为NaN时才合并/替换

python-仅当所有多列的值都为NaN时才合并/替换,python,pandas,numpy,Python,Pandas,Numpy,我正在寻找一个类似于但适用于多个列的解决方案。所以我有这个表1: date client_id product_id date2 col2 col3 1/1/15 1 A 1/1/20 50 AAA 1/2/15 2 B 1/3/30 40 BBB 1/3/15 2 B NaN NaN NaN 我需要将其与表2合并: dat

我正在寻找一个类似于但适用于多个列的解决方案。所以我有这个
表1

date   client_id   product_id  date2   col2   col3
1/1/15 1           A           1/1/20  50     AAA
1/2/15 2           B           1/3/30  40     BBB
1/3/15 2           B           NaN     NaN    NaN
我需要将其与
表2
合并:

date   client_id   product_id  date3   col2  col3
1/1/15 1           A           1/1/20  1000   XXX
1/2/15 2           B           NaN     NaN    NaN
1/3/15 2           B           2/3/27  3000   ZZZ
产生如下
表1
(预期输出):

表1
表2
的行数相同,因为两个表的关键列(
日期
客户id
产品id
)相同。然而,它们的主要区别在于
date2
date3
。如果
date2
为空,则所有
col
列将为空(从
col2
col500
),与
date3
相同。但是,我需要将
date2
为空的地方替换为
date3
的值(给定键列)

开头链接中的解决方案为每个需要替换的列创建一个辅助列,但对于500列的数据集来说这是不切实际的


有什么建议吗?

一个快捷的方法是使用
concat
groupby

(pd.concat([table1, table2.rename(columns={'date3':'date2'})])
   .groupby(['date','client_id'], as_index=False)
   .first()
)
输出:

     date  client_id product_id   date2    col2 col3
0  1/1/15          1          A  1/1/20    50.0  AAA
1  1/2/15          2          B  1/3/30    40.0  BBB
2  1/3/15          2          B  2/3/27  3000.0  ZZZ

一种快速方法是使用
concat
groupby

(pd.concat([table1, table2.rename(columns={'date3':'date2'})])
   .groupby(['date','client_id'], as_index=False)
   .first()
)
输出:

     date  client_id product_id   date2    col2 col3
0  1/1/15          1          A  1/1/20    50.0  AAA
1  1/2/15          2          B  1/3/30    40.0  BBB
2  1/3/15          2          B  2/3/27  3000.0  ZZZ

你能解释一下吗?它保留了第一个什么?我是否应该将产品id也包括在分组中,因为它是合并的关键之一?是的,我想我没有彻底阅读这个问题。这个想法是groupby可以像merge一样工作,而first将忽略NaN并尝试查找第一个有效值。您能解释一下吗?它保留了第一个什么?我是否应该将产品id也包括在分组中,因为它是合并的关键之一?是的,我想我没有彻底阅读这个问题。其思想是groupby可以像merge一样工作,而first将忽略NaN并尝试查找第一个有效值。