在没有任何密钥的情况下合并两个 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")