【问题标题】:How to merge two datasets on incomplete columns?如何在不完整的列上合并两个数据集?
【发布时间】:2022-11-10 20:30:08
【问题描述】:

我想合并'key1'和'key2'列上的两个数据集,以便在缺少值的情况下,例如,在'key2'列中,它将采用属于第一个键的第二个键的所有组合。这是一个例子:

    def merge_nan_as_any(mask, data, on, how)
        ...


    mask = pd.DataFrame({'key1': [1,1,2,2],
                         'key2': [None,3,1,2],
                         'value2': [1,2,3,4]})
    data = pd.DataFrame({'key1': [1,1,1,2,2,2],
                         'key2': [1,2,3,1,2,3],
                         'value1': [1,2,3,4,5,6]})

    result = merge_nan_as_any(mask, data, on=['key1', 'key2'], how='left')

    result = pd.DataFrame({'key1': [1,1,1,1,2,2],
                           'key2': [1,2,3,3,1,2],
                           'value2': [1,1,1,2,3,4],
                           'value1': [1,2,3,3,4,5]})

第二个键有一个缺失值,因此它从第二个数据集中获取满足条件的所有行:key1 必须等于 1,key2 是第二个数据集中的任何第二个键值。怎么做?

我想到的第一个明显的解决方案是遍历第一个数据集并过滤出满足条件的组合,第二个是将第一个数据集拆分为多个数据集,以便它们在同一列中具有 NaN 并合并每个它们在具有值的列上。

但我不喜欢这些解决方案,并猜测有更优雅的方式来做我想做的事。

我将不胜感激任何帮助!

【问题讨论】:

    标签: pandas merge


    【解决方案1】:

    我将首先用来自其他数据帧的所有唯一值的列表填充空值。然后,分解它以获得所有可能的组合并转换回数字。最后,将它们合并以实现预期的输出:

    mask['key2'] = mask['key2'].fillna(' '.join([str(x) for x in data['key2'].unique()])).astype(str).str.split(' ')
    mask = mask.explode('key2')
    mask['key2'] = pd.to_numeric(mask['key2'])
    pd.merge(mask,data,on=['key1','key2'],how='left')
    

    输出:

       key1  key2  value2  value1
    0     1     1       1       1
    1     1     2       1       2
    2     1     3       1       3
    3     1     3       2       3
    4     2     1       3       4
    5     2     2       4       5
    

    【讨论】:

      【解决方案2】:

      简单的方法,在 key1/key2 上合并非 NaN 值,仅在 key1 上合并 NaN 值和concat

      m = mask['key2'].notna()
      
      result = pd.concat([data.merge(mask[~m].drop(columns='key2'), on='key1'),
                          data.merge(mask[m], on=['key1', 'key2']),
                         ], ignore_index=True)
      

      输出:

         key1  key2  value1  value2
      0     1     1       1       1
      1     1     2       2       1
      2     1     3       3       1
      3     1     3       3       2
      4     2     1       4       3
      5     2     2       5       4
      

      【讨论】:

        猜你喜欢
        • 2021-10-16
        • 1970-01-01
        • 2021-01-28
        • 2010-10-02
        • 1970-01-01
        • 2021-05-27
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        相关资源
        最近更新 更多