Как сравнить два столбца данных, чтобы убедиться в отсутствии совпадений данных - PullRequest
0 голосов
/ 05 февраля 2019

Я выполняю сравнение, чтобы убедиться, что номера счетов в 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?

Любые идеи будут с благодарностью =)

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Имеет смысл использовать account number в качестве индекса в результирующем DataFrame и хранить номера строк в столбцах.Простейшим решением будет проверить каждую пару индексов в df1 и df2 и сохранить номера строк в df3, это будет иметь сложность O (n ^ 2).

Редактировать: Похоже, вы можете повысить производительность, отфильтровав df1 и df2, используя .isin, хотя я тестировал его только с фиктивными данными.Это все еще 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, использовать их будет невозможно 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)
0 голосов
/ 05 февраля 2019

Вы можете объединить столбец, а затем использовать выходные данные для поиска проблемных строк в исходных наборах данных.

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)]

При слиянии будет возвращен фрейм данных со строками, в которых «Номер счета» равен..values превратит это в пустой массив, который вы могли бы использовать для поиска, какие строки в исходном кадре данных вам нужны?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...