在没有任何密钥的情况下合并两个 df
Merging two df without any key
我有两个 df 并想合并它们,因为我需要一个 df 用于仪表板。我的问题是我的数据没有唯一键,所有数据点都在重复。例如我有这样的 df1:
Web Obj
A ObJA
A ObjB
B ObjA
B ObjD
B ObjA
df2
Web Lab Cat
A LabA F
A LabB F
A LabF F
A LabA F
B LabG G
B LabD G
我想合并它们,但我没有密钥...我在想我可以创建 Web 的每个项目 6 次,因为值不会超过 6...然后一个一个地添加值。 .. 额外的 Web 值显示“NaN”所以输出看起来像这样
Web Lab Cat Obj
A LabA F ObJA
A LabB F ObjB
A LabF F
A LabA F
A
A
B LabG G ObjA
B LabD G ObjD
B ObjA
B
B
B
或任何其他方式...?
您可以创建一个 key
列并按此方式执行 merge
:
df2 = (df2.assign(key=df2['Web'] + (df2.groupby('Web').cumcount() + 1).astype(str))
.merge(df1.assign(key=df1['Web'] + (df1.groupby('Web').cumcount() + 1).astype(str))
.drop('Web', axis=1),
on='key', how='outer'))
df2['Web']=df2['Web'].ffill()
df2
Out[1]:
Web Lab Cat key Obj
0 A LabA F A1 ObJA
1 A LabB F A2 ObjB
2 A LabF F A3 NaN
3 A LabA F A4 NaN
4 B LabG G B1 ObjA
5 B LabD G B2 ObjD
6 B NaN NaN B3 ObjA
基于将“Lab”和“Obj”列联系在一起似乎没有逻辑的事实,我认为将它们放在同一行没有意义:
df = pd.concat([df1.merge(df2[['web','Cat']].drop_duplicates(), on = 'web'),
df2]).reset_index(drop = True)
print(df)
web Obj Cat Lab
0 A ObJA F NaN
1 A ObJB F NaN
2 B ObJA G NaN
3 B ObJD G NaN
4 B ObJA G NaN
5 A NaN F LabA
6 A NaN F LabB
7 A NaN F LabF
8 A NaN F LabA
9 B NaN G LabG
10 B NaN G LabD
您可以创建一个新列以方便合并:
df1["new"] = df1.groupby("Web").size().apply(range).explode().values
df2["new"] = df2.groupby("Web").size().apply(range).explode().values
df_final = df2.merge(df1, on = ["Web","new"], how = "outer")
# Web Lab Cat new Obj
#0 A LabA F 0.0 ObJA
#1 A LabB F 1.0 ObjB
#2 A LabF F 2.0 NaN
#3 A LabA F 3.0 NaN
#4 B LabG G 0.0 ObjA
#5 B LabD G 1.0 ObjD
#6 B NaN NaN 2.0 ObjA
您可以选择删除新列并对数据框进行排序:
df_final.drop("new", axis = 1).sort_values(by = "Web")
我有两个 df 并想合并它们,因为我需要一个 df 用于仪表板。我的问题是我的数据没有唯一键,所有数据点都在重复。例如我有这样的 df1:
Web Obj
A ObJA
A ObjB
B ObjA
B ObjD
B ObjA
df2
Web Lab Cat
A LabA F
A LabB F
A LabF F
A LabA F
B LabG G
B LabD G
我想合并它们,但我没有密钥...我在想我可以创建 Web 的每个项目 6 次,因为值不会超过 6...然后一个一个地添加值。 .. 额外的 Web 值显示“NaN”所以输出看起来像这样
Web Lab Cat Obj
A LabA F ObJA
A LabB F ObjB
A LabF F
A LabA F
A
A
B LabG G ObjA
B LabD G ObjD
B ObjA
B
B
B
或任何其他方式...?
您可以创建一个 key
列并按此方式执行 merge
:
df2 = (df2.assign(key=df2['Web'] + (df2.groupby('Web').cumcount() + 1).astype(str))
.merge(df1.assign(key=df1['Web'] + (df1.groupby('Web').cumcount() + 1).astype(str))
.drop('Web', axis=1),
on='key', how='outer'))
df2['Web']=df2['Web'].ffill()
df2
Out[1]:
Web Lab Cat key Obj
0 A LabA F A1 ObJA
1 A LabB F A2 ObjB
2 A LabF F A3 NaN
3 A LabA F A4 NaN
4 B LabG G B1 ObjA
5 B LabD G B2 ObjD
6 B NaN NaN B3 ObjA
基于将“Lab”和“Obj”列联系在一起似乎没有逻辑的事实,我认为将它们放在同一行没有意义:
df = pd.concat([df1.merge(df2[['web','Cat']].drop_duplicates(), on = 'web'),
df2]).reset_index(drop = True)
print(df)
web Obj Cat Lab
0 A ObJA F NaN
1 A ObJB F NaN
2 B ObJA G NaN
3 B ObJD G NaN
4 B ObJA G NaN
5 A NaN F LabA
6 A NaN F LabB
7 A NaN F LabF
8 A NaN F LabA
9 B NaN G LabG
10 B NaN G LabD
您可以创建一个新列以方便合并:
df1["new"] = df1.groupby("Web").size().apply(range).explode().values
df2["new"] = df2.groupby("Web").size().apply(range).explode().values
df_final = df2.merge(df1, on = ["Web","new"], how = "outer")
# Web Lab Cat new Obj
#0 A LabA F 0.0 ObJA
#1 A LabB F 1.0 ObjB
#2 A LabF F 2.0 NaN
#3 A LabA F 3.0 NaN
#4 B LabG G 0.0 ObjA
#5 B LabD G 1.0 ObjD
#6 B NaN NaN 2.0 ObjA
您可以选择删除新列并对数据框进行排序:
df_final.drop("new", axis = 1).sort_values(by = "Web")