Python 合并相同的数据帧,以便将每一行与其他每一行进行比较

Python 合并相同的数据帧,以便将每一行与其他每一行进行比较,python,mysql,pandas,Python,Mysql,Pandas,我试着将每一行与每一行进行比较。我不想使用apply,因为我需要能够在以后使用结果,而apply需要太长时间。使用MySQL,这个过程目前只需要不到一秒钟的时间,并且希望在熊猫中也需要同样的时间 这张桌子在开头 import pandas columns = ["id", "c1", "c2", "c3", "c4"] table = [ [1, 'test', 'a1', 100, "unspecified"], [2, 'test', 'a2', 200, "unspeci

我试着将每一行与每一行进行比较。我不想使用apply,因为我需要能够在以后使用结果,而apply需要太长时间。使用MySQL,这个过程目前只需要不到一秒钟的时间,并且希望在熊猫中也需要同样的时间

这张桌子在开头

import pandas

columns = ["id", "c1", "c2", "c3", "c4"]
table = [
    [1, 'test', 'a1', 100, "unspecified"],
    [2, 'test', 'a2', 200, "unspecified"],
    [3, 'test', 'a3', 300, "unspecified"],
]
df = pandas.DataFrame(data=table, columns=columns)
MySQL中的查询

SELECT *
FROM
db.df AS s1,
db.df AS s2;
由于这个查询,我希望得到相同的结果,但只是使用pandas,或者至少在python中使用pandas

id  c1      c2  c3  c4          id  c1      c2  c3  c4
1   test    a1  100 unspecified 1   test    a1  100 unspecified
2   test    a2  200 unspecified 1   test    a1  100 unspecified
3   test    a1  300 unspecified 1   test    a1  100 unspecified
1   test    a1  100 unspecified 2   test    a2  200 unspecified
2   test    a2  200 unspecified 2   test    a2  200 unspecified
3   test    a1  300 unspecified 2   test    a2  200 unspecified
1   test    a1  100 unspecified 3   test    a1  300 unspecified
2   test    a2  200 unspecified 3   test    a1  300 unspecified
3   test    a1  300 unspecified 3   test    a1  300 unspecified

正如您所看到的,所有行a都已相互重新比较。我是熊猫队的新手,在查阅文档时,我似乎找不到任何有助于我实现这一目标的东西。目前,我正在通过在docker容器中启动MySQL数据库并在其上运行该过程来解决这个问题,但这感觉像是一种非常冗长的方式,并使自动化测试感到痛苦。那么有没有一种方法可以在pandas中得到相同的结果呢

因为您的MySQL查询是隐式的、较旧版本的
交叉连接
,所以在pandas中通过合并相同值的键来运行相同的笛卡尔叉积:

cj_df = pd.merge(df.assign(key = 1), df.assign(key = 1), on = 'key')
并使用
id
字段添加筛选器以避免反向重复和相同行匹配:

cj_df = (pd.merge(df.assign(key = 1), df.assign(key = 1), on = 'key')
           .query("id_x < id_y")
           .drop(columns = ['key'])
        )
cj_df=(pd.merge(df.assign(key=1)、df.assign(key=1)、on='key')
.query(“id\u x
您可以查看
np。我认为没有人会很好地将您的查询分离出来,然后用pandas重新编写,但您可以使用numpy轻松地在pandas中编写条件语句:哦,您的数据来自哪里?它来自mysql吗?我不太关心where条件,但更关心查询的第一部分,其中所有行都相互比较``SELECT*from db.df AS s1,db.df AS s2``我将编辑问题以澄清问题现在已经编辑好了,我希望它更清晰谢谢你,这是一个聪明的解决方案。1个问题,为什么结果中没有关键栏?因为这是一个新专栏,我原以为它会很棒!很乐意帮忙。我用
drop
call删除键列。