[英]Merge two dataframes on multiple columns but only merge on columns if both not NaN
我希望跨多列合并两个数据框,但有一些额外的条件。
import pandas as pd
df1 = pd.DataFrame({
'col1': ['a','b','c', 'd'],
'optional_col2': ['X',None,'Z','V'],
'optional_col3': [None,'def', 'ghi','jkl']
})
df2 = pd.DataFrame({
'col1': ['a','b','c', 'd'],
'optional_col2': ['X','Y','Z','W'],
'optional_col3': ['abc', 'def', 'ghi','mno']
})
我想总是加入col1
但然后尝试也加入optional_col2
和optional_col3
。 在df1
,两列的值都可以是NaN
,但它始终填充在df2
。 当col1
+ optional_col2
或optional_col3
匹配时,我希望连接有效。
这将分别导致['a', 'b', 'c']
由于精确col2
、 col3
和精确匹配而加入。
在 SQL 中,我想你可以这样写连接,如果它有助于进一步解释:
select
*
from
df1
inner join
df2
on df1.col1 = df2.col2
AND (df1.optional_col2 = df2.optional_col2 OR df1.optional_col3 = df2.optional_col3)
我弄乱了pd.merge
但不知道如何进行这样的复杂操作。 我想我可以做上的合并['col1', 'optional_col2']
然后在第二合流['col1', 'optional_col_3']
那么工会和删除重复?
预期的 DataFrame 将类似于:
merged_df = pd.DataFrame({
'col1': ['a', 'b', 'c'],
'optional_col_2': ['X', 'Y', 'Z'],
'optional_col_3': ['abc', 'def', 'ghi']
})
我认为您可以通过在加入之前使用 df2 中的值填充 df1 中列的NaN
来实现您想要的,即
df1["optional_col2"] = df1["optional_col2"].fillna(df2["optional_col2"])
df1["optional_col3"] = df1["optional_col3"].fillna(df2["optional_col3"])
pd.merge(df1, df2, on=["col1", "optional_col2", "optional_col3"])
这给出了您预期的答案
col1 optional_col2 optional_col3
0 a X abc
1 b Y def
2 c Z ghi
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.