如何组合数据帧但在匹配时组合匹配值和标记?

How to combine dataframes but combine matching values and marking when there's a match?

数据科学新手,很抱歉措辞混乱。 我需要合并两个具有相似数据的数据框。如果“C 名称”列存在于两者中,那么我不想重复它,而是在“SW1 包含”和“SW2 包含”中放置一个复选标记。如果 C 名称是唯一的,它只是添加到组合的 table 中并带有相应的复选标记。

这些是我的 table 的 2 个简化示例。我必须将 4 帧组合在一起[=13​​=]

df_s = pd.DataFrame({'C Category': ["Hull","Hull","Hull","Mid High","Mid High","Mid High2"],
                     'C Name': ["Trunk","Roof","Ceiling","Floor","Plank","Fuel"],
                     'SW1 Contain': ["NAN","NAN","NAN","NAN","NAN","NAN"],
                     'SW1 Type': ["NAN","NAN","NAN","NAN","NAN","NAN"],
                     'SW2 Contain': ["√","√","√","√","√","√"],
                     'SW2 Type': ["NAN","NAN","NAN","NAN","NAN","NAN"]})

  C Category   C Name SW1 Contain SW1 Type SW2 Contain SW2 Type
0       Hull    Trunk         NAN      NAN           √      NAN
1       Hull     Roof         NAN      NAN           √      NAN
2       Hull  Ceiling         NAN      NAN           √      NAN
3   Mid High    Floor         NAN      NAN           √      NAN
4   Mid High    Plank         NAN      NAN           √      NAN
5  Mid High2     Fuel         NAN      NAN           √      NAN

df_s2 = pd.DataFrame({'C Category': ["Hull","Hull","Lower","Lower2","Mid High","Mid High2"],
                     'C Name': ["Trunk","Roof","Tank","Axel","Floor","Fuel"],
                     'SW1 Contain': ["√","√","√","√","√","√"],
                     'SW1 Type': ["NAN","NAN","NAN","NAN","NAN","NAN"],
                     'SW2 Contain': ["NAN","NAN","NAN","NAN","NAN","NAN"],
                     'SW2 Type': ["NAN","NAN","NAN","NAN","NAN","NAN"]})

  C Category C Name SW1 Contain SW1 Type SW2 Contain SW2 Type
0       Hull  Trunk           √      NAN         NAN      NAN
1       Hull   Roof           √      NAN         NAN      NAN
2      Lower   Tank           √      NAN         NAN      NAN
3     Lower2   Axel           √      NAN         NAN      NAN
4   Mid High  Floor           √      NAN         NAN      NAN
5  Mid High2   Fuel           √      NAN         NAN      NAN

我需要它看起来像这样(C Category/Name 的顺序无关紧要)

  C Category   C Name SW1 Contain SW1 Type SW2 Contain SW2 Type
0       Hull    Trunk           √      NAN           √      NAN
1       Hull     Roof           √      NAN           √      NAN
2       Hull  Ceiling         NAN      NAN           √      NAN
3      Lower     Tank           √      NAN         NAN      NAN
4     Lower2     Axel           √      NAN         NAN      NAN
5   Mid High    Floor           √      NAN           √      NAN
6   Mid High    Plank         NAN      NAN           √      NAN
7  Mid High2     Fuel           √      NAN           √      NAN

我试过 pd.concat([df_s,df[~df.isin(df_s)].dropna()])(df 是一个空白数据框,我将 4 个 table 逐一添加到 1)。这个想法是检查 df 中是否不存在某些东西,它不会添加它。但是加上1table后就不行了。如果这不是最好的方法,请告诉我。

我也在考虑遍历框架并执行 if 语句。如果某行不在 df 中,则将其附加到 df。但这将非常昂贵,所以请让我知道解决这个问题的最佳方法。我还在学习,所以希望得到任何建议。

一个选项是将 "NaN" 字符串替换为 NaN 值,连接然后使用 groupby.first 删除重复的“C 类别”和“C 名称”对:

out = (pd.concat([df_s.replace('NAN', float('nan')), df_s2.replace('NAN', float('nan'))])
       .groupby(['C Category', 'C Name'], as_index=False, sort=False).first().fillna(float('nan')))

输出:

  C Category   C Name SW1 Contain  SW1 Type SW2 Contain  SW2 Type
0       Hull    Trunk           √       NaN           √       NaN
1       Hull     Roof           √       NaN           √       NaN
2       Hull  Ceiling         NaN       NaN           √       NaN
3   Mid High    Floor           √       NaN           √       NaN
4   Mid High    Plank         NaN       NaN           √       NaN
5  Mid High2     Fuel           √       NaN           √       NaN
6      Lower     Tank           √       NaN         NaN       NaN
7     Lower2     Axel           √       NaN         NaN       NaN