Python 合并相同的数据帧,以便将每一行与其他每一行进行比较
我试着将每一行与每一行进行比较。我不想使用apply,因为我需要能够在以后使用结果,而apply需要太长时间。使用MySQL,这个过程目前只需要不到一秒钟的时间,并且希望在熊猫中也需要同样的时间 这张桌子在开头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
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删除键列。