pandas - 如何合并不完整列上的两个数据集?

标签 pandas merge

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

    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,并且将它们中的每一个合并到具有值的列上。

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

如果您有任何帮助,我将不胜感激!

最佳答案

简单的方法,对于非 NaN 值在 key1/key2 上合并,仅对于 NaN 值在 key1 上合并并 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

关于pandas - 如何合并不完整列上的两个数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74388723/

相关文章:

python - 如何删除来自 loc 函数的行? ( Pandas )

php:将数组与 mysql 结果合并并按数组键对它们进行排序

merge - lodash mergeWith,跳过一些键

vba - 将多个 Excel 文件中相同结构的工作表添加到一个文件中

python - 在 Python 中实现不相交集系统

java - 如何管理eclipse git权限?

python - 将 pandas 数据框列及其顺序保留在数据透视表中

python - 将大型位置数据帧的东距和北距快速转换为纬度和经度

python - 定义函数以基于其他列创建列(pandas)

python - 如何在 Pandas 中将 int64 转换为日期时间