如何组合数据帧但在匹配时组合匹配值和标记?
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
数据科学新手,很抱歉措辞混乱。 我需要合并两个具有相似数据的数据框。如果“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