如何比较两列数据以确保所有数据都不匹配

2024-05-20 22:03:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在进行比较,以确保df1中的帐号不会泄漏到df2中的其他帐号

我的目的是识别并输出每个df中包含任何“不需要的”匹配帐号的行坐标和值

df1和df2有一个包含帐号的列,如下所示:

df1
Account Number
1234
5678
9101
1121

df2
Account Number
3141
5161
7181
9202
1222
1234

df2中的行数不同于df1,两个数据帧中都有一个匹配值1234。考虑到每行计数从零开始,我希望的输出如下:

df1 Row 0 = df2 Row 5 as 1234

我是新来的熊猫,所以请原谅我的术语和方法来完成这一点。如果有更好更棒的方法来做这件事,我很乐意听到并实施它。你知道吗

我做了研究,我想可能有一种方法可以使用合并或isin方法?你知道吗

任何想法都将不胜感激()


Tags: 数据方法目的numberdfasaccountrow
2条回答

使用account number作为结果DataFrame中的索引并将行号存储在列中是有意义的。最简单的解决方案是检查df1df2中的每一对索引,并将行号存储在df3,它的复杂性为O(n^2)。你知道吗

编辑:看起来,您可以通过使用.isin过滤df1df2来提高性能,尽管我只使用模拟数据对其进行了测试。它仍然是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:如果账号在df1df2中不唯一,则无法使用account number作为索引:

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)

您可以对列进行合并,然后使用输出查找原始数据集中的问题行

target_col = 'Account Number'
matching_account_nos = pd.merge(df1[[target_col]], df2[[target_col]], on='Account Number'), how='inner').values

# now use this to look up the rows in the original dataframes
problem_rows_df1 = df1[df1[target_col].isin(matching_account_nos)]
problem_rows_df2 = df2[df2[target_col].isin(matching_account_nos)]

合并将返回一个数据帧,其中包含“Account Number”相等的行。.values将把它转换成一个numpy数组,您可以用它来查找您需要的原始数据帧中的哪些行?你知道吗

相关问题 更多 >