【问题标题】:python - merge/replace only when value is NaN for all multiple columnspython - 仅当所有多列的值为 NaN 时才合并/替换
【发布时间】:2021-03-08 17:17:23
【问题描述】:

我正在寻找类似于this one 的解决方案,但适用于多个列。所以我有这个table1

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

我需要将它与table2 合并:

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

产生像这样的table1(预期输出):

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           2/3/27   3000   ZZZ

table1table2 的行数相同,因为两个表的键列(dateclient_idproduct_id)相同。但是,它们的主要区别在于date2date3。如果date2 为空,则所有col 列都将为空(从col2col500),date3 也是如此。但是,在给定键列的情况下,我需要用 date3 的值替换 date2 为 null 的位置。

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

有什么建议吗?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    一种快速的方法是使用concatgroupby

    (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
    

    【讨论】:

    • 你能解释一下吗?它保持第一个什么?我是否应该在 group_by 中也包含 product_id,因为它是合并的关键之一?
    • 是的,我想我没有仔细阅读这个问题。这个想法是 groupby 可以像合并一样,而 first 将忽略 NaN 并尝试找到第一个有效值。
    猜你喜欢
    • 2019-09-27
    • 2021-03-21
    • 1970-01-01
    • 2021-03-08
    • 2015-07-29
    • 2021-02-18
    • 2021-12-08
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多