Pandas两个数据框的交叉连接

33
我找不到关于交叉连接包含合并/连接或其他内容的任何信息。我需要使用{我的函数}作为myfunc来处理两个数据框。相当于:
{
    for itemA in df1.iterrows():
           for itemB in df2.iterrows():
                       t["A"] = myfunc(itemA[1]["A"],itemB[1]["A"])
 }      

等同于:

{
 select myfunc(df1.A,df2.A),df1.A,df2.A from df1,df2;
}

但我需要更有效率的解决方案: 如果使用apply,我将如何实现它们。谢谢;^^

你解决了吗?如果有问题,请在我的回答中评论。 - leroyJr
2个回答

63
创建一个通用的“键”来交叉连接这两个:
df1['key'] = 0
df2['key'] = 0

df1.merge(df2, on='key', how='outer')

虽然这种方法有些粗糙,但概念上非常容易理解!谢谢 - chinnychinchin
12
在合并语句中,你还需要添加 on='key' 参数。 - Jon Scott
7
我认为how参数对结果没有影响。你可以将其省略并使用默认值(即inner)。 - alejandro
@alejandro OP特别要求进行交叉连接,这与外连接相同,而不是内连接。 - A.Kot
2
@A.Kot 我理解你的观点,但就你的代码而言,使用how参数不会造成影响,因为你是在一个固定的键上进行连接,这个键始终匹配,所以inner不会消除任何行。 - alejandro

12

关于叉乘,请参见这个问题

基本上,您需要执行普通合并操作,但给每一行相同的键以加入,在帧之间使每一行都彼此连接。

然后,您可以通过应用您的函数向新框架添加列:

new_df = pd.merge(df1, df2, on=key)
new_df.new_col = new_df.apply(lambda row: myfunc(row['A_x'], row['A_y']), axis=1)

axis=1 强制 .apply 沿行方向工作。如果合并的数据框中存在共享的列,像上面的例子一样,“A_x”和“A_y”将成为结果框架中默认的列名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接