我想合并“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/