如何在没有密钥的情况下实现SQL外连接的熊猫等效

TMW*_*MWP 4 python merge join dataframe

在SQL中,您可以在没有键的情况下联接两个表,以便两个表的所有记录相互合并。如果pandas.concat()or pandas.merge()或某些其他pandas语法支持此功能,则可以帮助我解决我要解决的问题的第一步。我在帮助文档中找到了一个外部联接选项,但是找不到确切的语法来执行我想要的操作(联接所有没有键的记录)。

为了更好地解释这一点:

import pandas as pd

lunchmenupairs2 = [["pizza", "italian"],["lasagna", "italian"],["orange", "fruit"]]
teamcuisinepreferences2 = [["ian", "*"]]

lunchLabels = ["Food", "Type"]
teamLabels = ["Person", "Type"]

df1 = pd.DataFrame.from_records(lunchmenupairs2, columns=lunchLabels)
df2 = pd.DataFrame.from_records(teamcuisinepreferences2, columns=teamLabels)

print(df1)
print(df2)
Run Code Online (Sandbox Code Playgroud)

输出这些表:

      Food     Type
0    pizza  italian
1  lasagna  italian
2   orange    fruit

  Person     Type
0    ian        *
Run Code Online (Sandbox Code Playgroud)

我希望合并的最终结果是:

  Person     Type Food     Type
0  ian        *   pizza     italian
1  ian        *   lasagna   italian
2  ian        *   orange    fruit
Run Code Online (Sandbox Code Playgroud)

然后,我可以轻松删除不需要的列,并转到我正在处理的代码中的下一步。这不起作用:

merged_data = pd.merge(left=df2,right=df1, how='outer')
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以进行这种DataFrame合并?

Ran*_*esh 8

这是可能的cross-join在 Pandas 1.2.0 中引入。只需运行:

df1.merge(df2, how='cross')
Run Code Online (Sandbox Code Playgroud)


EFT*_*EFT 5

您可以在两个df中添加一个具有恒定值的列,

>>>df1['joincol'] = 1
>>>df2['joincol'] = 1
>>>pd.merge(left=df2,right=df1, on='joincol', how='outer')
  Person Type_x  joincol     Food   Type_y
0    ian      *        1    pizza  italian
1    ian      *        1  lasagna  italian
2    ian      *        1   orange    fruit
Run Code Online (Sandbox Code Playgroud)

然后在删除其他不希望的列时将其删除。