Python 如何比较两列数据以确保所有数据都不匹配
我正在进行一次比较,以确保df1中的帐号不会渗入df2中的其他帐号 我的目的是识别并输出每个df中包含任何“不需要的”匹配账号的行坐标和值 df1和df2有一列,其中包含以下帐号:Python 如何比较两列数据以确保所有数据都不匹配,python,pandas,compare,Python,Pandas,Compare,我正在进行一次比较,以确保df1中的帐号不会渗入df2中的其他帐号 我的目的是识别并输出每个df中包含任何“不需要的”匹配账号的行坐标和值 df1和df2有一列,其中包含以下帐号: df1 账号 1234 5678 9101 1121 df2 账号 3141 5161 7181 9202 1222 1234 df2中的行数不同于df1,两个数据帧中都有一个匹配值1234。考虑到每行计数从零开始,我希望的输出如下: df1第0行=df2第5行为1234 我是新来的熊猫,所以请原谅我的术语,以及实
df1
账号
1234
5678
9101
1121
df2
账号
3141
5161
7181
9202
1222
1234
df2中的行数不同于df1,两个数据帧中都有一个匹配值1234。考虑到每行计数从零开始,我希望的输出如下:
df1第0行=df2第5行为1234
我是新来的熊猫,所以请原谅我的术语,以及实现这一点的方法。如果有更好更棒的方法来实现它,我很乐意听到并实现它
我做了研究,我认为可能有一种方法可以使用合并或isin方法
如果您有任何想法,我们将不胜感激。=)您可以在列上进行合并,然后使用输出查找原始数据集中的问题行
target\u col='账号'
匹配_account\u nos=pd.merge(df1[[target\u col]],df2[[target\u col]],on='account Number'),how='internal')。值
#现在使用它来查找原始数据帧中的行
问题\u行\u df1=df1[df1[目标\u列].isin(匹配的\u帐户\u编号)]
问题\u行\u df2=df2[df2[目标\u列].isin(匹配的\u帐户\u编号)]
合并将返回一个数据帧,其中的行“Account Number”相等。
.values
会将其转换为一个numpy数组,您可以使用该数组查找原始数据帧中需要的行 您可以在列上进行合并,然后使用输出查找原始数据集中的问题行
target\u col='账号'
匹配_account\u nos=pd.merge(df1[[target\u col]],df2[[target\u col]],on='account Number'),how='internal')。值
#现在使用它来查找原始数据帧中的行
问题\u行\u df1=df1[df1[目标\u列].isin(匹配的\u帐户\u编号)]
问题\u行\u df2=df2[df2[目标\u列].isin(匹配的\u帐户\u编号)]
合并将返回一个数据帧,其中的行“Account Number”相等。
.values
会将其转换为一个numpy数组,您可以使用该数组查找原始数据帧中需要的行 在生成的DataFrame
中使用account number
作为索引并将行号存储在列中是有意义的。最简单的解决方案是检查df1
和df2
中的每一对索引,并将行号存储在df3
中,其复杂性为O(n^2)
编辑:看起来,您可以通过使用.isin
过滤df1
和df2
来提高性能,尽管我只使用模拟数据对其进行了测试。它仍然是O(n^2),但现在n是匹配帐户的数量,而不是行的总数
import pandas as pd
d1 = {'account': [1234, 5678, 9101, 1121]}
d2 = {'account': [3141, 5161, 7181, 9202, 1222, 1234]}
d3 = {'r1': [], 'r2': []}
df1 = pd.DataFrame(data = d1)
df2 = pd.DataFrame(data = d2)
df3 = pd.DataFrame(data = d3)
match1 = df1.account.isin(df2.account.values)
match2 = df2.account.isin(df1.account.values)
for r1 in df1[match1].index:
for r2 in df2[match2].index:
if df1.account[r1] == df2.account[r2]:
idx = df1.account[r1]
row = {'r1': r1, 'r2': r2}
df3.loc[idx] = row
编辑2:我可以用这个版本获得更好的性能,而且更简单:
match1 = df1.account.isin(df2.account.values)
for r1 in df1[match1].index:
idx = df1.account[r1]
r2 = df2[df2.account == idx].index[0]
row = {'r1': r1, 'r2': r2}
df3.loc[idx] = row
编辑3:如果账号在df1
和df2
中不唯一,则无法使用账号作为索引:
df3 = pd.DataFrame()
match1 = df1.account.isin(df2.account.values)
for r1 in df1[match1].index:
idx = df1.account[r1]
for r2 in df2[df2.account == idx].index:
row = {'account': idx, 'r1': r1, 'r2': r2}
df3 = df3.append(row, ignore_index=True)
使用账号
作为生成的数据框
中的索引,并将行号存储在列中是有意义的。最简单的解决方案是检查df1
和df2
中的每一对索引,并将行号存储在df3
中,其复杂性为O(n^2)
编辑:看起来,您可以通过使用.isin
过滤df1
和df2
来提高性能,尽管我只使用模拟数据对其进行了测试。它仍然是O(n^2),但现在n是匹配帐户的数量,而不是行的总数
import pandas as pd
d1 = {'account': [1234, 5678, 9101, 1121]}
d2 = {'account': [3141, 5161, 7181, 9202, 1222, 1234]}
d3 = {'r1': [], 'r2': []}
df1 = pd.DataFrame(data = d1)
df2 = pd.DataFrame(data = d2)
df3 = pd.DataFrame(data = d3)
match1 = df1.account.isin(df2.account.values)
match2 = df2.account.isin(df1.account.values)
for r1 in df1[match1].index:
for r2 in df2[match2].index:
if df1.account[r1] == df2.account[r2]:
idx = df1.account[r1]
row = {'r1': r1, 'r2': r2}
df3.loc[idx] = row
编辑2:我可以用这个版本获得更好的性能,而且更简单:
match1 = df1.account.isin(df2.account.values)
for r1 in df1[match1].index:
idx = df1.account[r1]
r2 = df2[df2.account == idx].index[0]
row = {'r1': r1, 'r2': r2}
df3.loc[idx] = row
编辑3:如果账号在df1
和df2
中不唯一,则无法使用账号作为索引:
df3 = pd.DataFrame()
match1 = df1.account.isin(df2.account.values)
for r1 in df1[match1].index:
idx = df1.account[r1]
for r2 in df2[df2.account == idx].index:
row = {'account': idx, 'r1': r1, 'r2': r2}
df3 = df3.append(row, ignore_index=True)
好的,太棒了!非常感谢您,我会尽快将其集成到我的代码中,并在收到结果后尽快与您联系!=)=)=)好的,当我运行这段代码时,它抛出了编译器错误,我确定需要另一个圆括号。所以我把它放在'pd.merge(df1('并且编译器不再抛出错误,但是当我运行它时,它给出了一个'DataFrame'类型的错误,对象不可调用?我缺少什么吗?=)虽然我接受了另一个答案作为我的解决方案,但我也希望通过yer方法进行故障排除,并将其作为概念证明来实现,这样我以后可以在性能方面测试哪种解决方案在针对数百万行运行时更优。您的所有时间和努力也远远超出了我们的欣赏范围!=)=PI我离解决方案开始工作越来越近了,已经在48k行上进行了测试,结果立竿见影。它只是出现在科学记数法中,这很奇怪,但它正在识别匹配项=)好吧,太棒了!非常感谢您,我会尽快将其集成到我的代码中,并在收到结果后尽快与您联系!=)=)=)好的,当我运行这段代码时,它抛出了编译器错误,我确定需要另一个圆括号。所以我把它放在'pd.merge(df1('并且编译器不再抛出错误,但是当我运行它时,它给出了'DataFrame'类型的错误,object是不可调用的?我是否遗漏了什么?=)之后虽然我接受了另一个答案作为我的解决方案,但我会喜欢它