Рубрики
Без рубрики

Сравнение рядов между двумя данными PandaS

Это сказка, так как время: ваша компания имеет несколько экземпляров того же дата … Помечено Pandas, Python, анализ данных, наукой данных.

Это сказка, так как время, как время: у вашей компании есть несколько экземпляров того же набора данных, который Должен Матч, но по любой причине, не делать. Очевидный пример, который приходит к уму, может быть расхождение между окружающими условиями: ваша положенная среда, вероятно, выпадает из синхронизации с производством часто. Это легкая проблема для решения, потому что это понятно Почему Эти типы систем выходят из синхронизации. Решение проблемы простой, как синхронизация одной системы к другой, как правило, когда одна система служит «источником истины». «Но как насчет несоответствий между системами без источник правды? Что мы делаем, когда параллельные системы должны иметь сопоставимые данные, но нет? Наконец, как мы можем выяснить, что пошло не так?

Компании склонны к тонам сценариев для этой точной проблемы, и они обычно такие ситуации, которые являются смертельными, когда нерешены. Например, скажем, ваша компания отслеживает новые напросы, добавив их в систему HR (например, бамбук или рабочий день). Эти новые программы напрос нуждаются в доступе к внутренним системам компании (например, слияние, или что-либо за VPN вашей компании). Ваша компания гордится тем, что «Scrappy», таким образом, зависит от ИТ-отдела для предоставления этих пользователей вручную вручную. Предполагая, что никто не сделал пользовательскую ошибку, эти системы будут соответствовать информации о пользователе … пока эти намыты не будут расторгнуты.

Независимо от ситуации, вы почти гарантированы в эту проблему в какой-то момент. К счастью для нас решение не слишком сложное.

Установка сцены

Предположение вот что мы сравниваем Ряды в наших данных. Нам нужны две наборы данных, которые имеют соответствующие столбцы, но разные записи. Придерживаясь нашего примера сотрудника, я собираюсь использовать два поддельных набора данных, содержащих информацию о сотрудниках как таковой:

424 raberkirderbr@shop-pro.jp. Женский Апельсист Маркетинг Ред
989 jacomerg@ustream.tv. Женский Акус Развитие бизнеса Джесса
318 macres8t@paypal.com. Женский Акра Маркетинг Marci
996 oocuttrn@flickr.com. Женский Акутт Служба поддержки Олимпе
516 badamideseb@google.pl. Мужчина Адамиды Исследования и развитие Бакси
743 maddeykm@vimeo.com. Женский Addey. Учет Melba
207 waddionisio5q@hhs.gov. Мужчина Addionisio. Человеческие ресурсы Вилли
764 nagutterl7@ow.ly. Мужчина Агрегат Учет Неисполнительно
950 aahlinqd@ihg.com. Мужчина Аглин Исследования и развитие Avery.
434 rakidc1@ow.ly. Мужчина Ребенок Инженер Ричарт
863 kalebrokeny@biglobe.ne.jp. Женский Alebrooke. Управление продуктом Калинди
250 malen6x@fema.gov. Женский Alen. Юридический Марка
481 walgiedc@paypal.com. Мужчина Algie. Управление продуктом Wilfrid

Мы сделаем два данных Pandas Dataframes из этих аналогичных наборов данных:

df1 = pd.read_csv('data/employees1.csv')
df2 = pd.read_csv('data/employees2.csv')

Теперь давайте добраться до работы.

Пандас сливается с показателями

Первый кусок магии так же просто, как и добавление аргумента ключевых слов в панды «объединиться». ” Объединение двух данных данных в Pands, настроек Индикатор = правда Добавляет столбец к объединенной таблице данных, где значение каждой строки может быть одним из трех возможных значений: left_only , right_only или оба :

990 ytumiotol@ehow.com. right_only. Мужчина Tumoto Повышение квалификации Янатон
962 lminichillom@photobucket.com. right_only. Женский МИНИЧИЛЬО Учет Лара
976 rhaldonn@bbc.co.uk. right_only. Женский Haldon Услуги Reine.
961 lmarcqp@merriam-webster.com. right_only. Мужчина Marcq. Инженер Лыман
221 fdanettr@ibm.com. обе Мужчина Данетт Человеческие ресурсы Indlelay
675 mrimbaults@feedburner.com. left_only. Мужчина Rimbault. Исследования и развитие Мухаммед
692 mruggent@unc.edu. left_only. Женский Ruggen. Маркетинг Мнение
669 redieu@so-net.ne.jp. left_only. Мужчина Реди Развитие бизнеса Isidoro.
783 nstrasev@utexas.edu обе Мужчина Страз Юридический Ничтожество
120 jbucktharpw@stansford.edu обе Мужчина Бассейн Исследования и развитие Джок
734 lsigertx@so-net.ne.jp. обе Женский Sigert. Продажи Ляора
52 bbehenekey@163.com. обе Женский Бенеке Служба поддержки Бери
563 cmoorcraftz@hao123.com. обе Женский Moorcroft Служба поддержки Сдержанный
172 kclubb10@gmpg.org. обе Мужчина Clubb. Управление продуктом Kelvin.
362 rushz11@hibu.com. обе Женский Hirtz. Юридический Стелла
273 reaage12@macromedia.com. обе Мужчина Жаждущий Услуги Archibold.

Как вы можете себе представить, строки помечены ценностью « и » в _ слияние Столбец обозначает строки, которые являются общими для обоих данных. _ left_only и right_only Mark Rows, которые присутствовали либо в левом или правом DataFrame соответственно.

У нас уже есть большой кусок головоломки. Давайте построим из этого, чтобы создать многоразовую функцию, которая возвращает точно Что мы ищем каждый раз.

Создание фрагмента кода

Давайте построим функцию под названием dataframe_difference () какие ответы на любой из 4 вопросов:

  1. Какие строки присутствовали только в первом DataFrame?
  2. Какие строки присутствовали только во втором DataFrame?
  3. Какие строки присутствовали в обоих данных?
  4. Какие ряды были не присутствует в обоих данных, но присутствует в одном из них?

Для начала наша функция dataframe_difference () нужно будет пропустить два данных данных для сравнения. Чтобы сделать вещи интересными, давайте добавим дополнительное аргумент ключевых слов, что позволяет нам вернуть строки для каждого из четырех сценариев выше:

def dataframe_difference(df1, df2, which=None):
    """Find rows which are different between two DataFrames."""
    comparison_df = df1.merge(df2,
                              indicator=True,
                              how='outer')
    if which is None:
        diff_df = comparison_df[comparison_df['_merge'] != 'both']
    else:
        diff_df = comparison_df[comparison_df['_merge'] == which]
    diff_df.to_csv('data/diff.csv')
    return diff_df

Если мы позвоним нашей функцией без аргумента ключевых слов (т.е.: dataframe_diffeneference (df1, df2) ), наша функция ответит вопрос № 4:

990 ytumiotol@ehow.com. right_only. Мужчина Tumoto Повышение квалификации Янатон
962 lminichillom@photobucket.com. right_only. Женский МИНИЧИЛЬО Учет Лара
976 rhaldonn@bbc.co.uk. right_only. Женский Haldon Услуги Reine.
961 lmarcqp@merriam-webster.com. right_only. Мужчина Marcq. Инженер Лыман
675 mrimbaults@feedburner.com. left_only. Мужчина Rimbault. Исследования и развитие Мухаммед
692 mruggent@unc.edu. left_only. Женский Ruggen. Маркетинг Мнение
669 redieu@so-net.ne.jp. left_only. Мужчина Реди Развитие бизнеса Isidoro.
746 RSLOAN16@ovh.net.net. left_only. Женский Слоана Продажи Рейанон
952 jpalle19@state.gov. right_only. Женский Палец Маркетинг Jennilee
970 ngrieger1c@quantcast.com. right_only. Женский Григер Маркетинг Недда

Как и ожидалось, ценности в слияние колонна содержит left_only и right_only , но не обе . Противоположность этого будет отвечать на вопрос № 3: какие строки присутствовали в обоих данных? Для этого мы можем пройти который = «оба» нашей функцией. dataframe_diffumense (df1, df2,) будет выглядеть что-то подобное:

863 mwhalebelly1f@jugem.jp. обе Женский Смягчить Учет Марсия
470 aletteresse1g@slashdot.org. обе Мужчина LeteSe. Учет Averell.
125 bbullough1h@comsenz.com. обе Женский Шум Управление продуктом БЕРРИ
258 vdreinkwater1i@posterous.com. обе Мужчина Пить воду Юридический Васили
701 lsarah1j@nationalgeage.com. обе Женский Сара Человеческие ресурсы Летиция
507 hmalec1k@ifeng.com. обе Женский Мошенничество Служба поддержки Хендрика
163 hchiplen1l@house.gov. обе Мужчина Чиплен Инженер Haskell.
90 gbonhome1m@163.com. обе Мужчина Бонмоме Человеческие ресурсы Гардинер
705 ascapens1n@sitemeter.com. обе Мужчина Скапыя Управление продуктом Arley.
127 dburrett1o@nydailynews.com. обе Женский Бурретт Повышение квалификации Дусей

Прохождение который = 'left_only' и который = 'rver_only' Сделайте именно то, что вы ожидаете.

Не стесняйтесь брать этот фрагмент и использовать его как свои собственные. Я добавил его в Github в качестве гейста здесь Отказ

Бонус раунд: Загрузка отсутствующих строк в таблицу SQL

Мы можем легко применить функцию, которую мы только что создали, чтобы помочь нам синхронизировать строки между двумя таблицами базы данных. Если мы хотим убедиться, что строки между двумя таблицами SQL SCL мы можем сделать что-то вроде этого:

df1 = pd.read_sql_table('table1',
                        con=engine,
                        index_col='id')
df2 = pd.read_sql_table('table2',
                        con=engine,
                        index_col='id')
diff_df = dataframe_difference(df1, df2)
diff_df.to_sql('table2',
               con=self.engine,
               index=True,
               index_label='id',
               if_exists='append')

Пандас to_sql () Метод имеет аргумент Nifty ключевых слов под названием if_exists Отказ Если мы установим if_exists = 'Добавить' При использовании to_sql () , Pandas добавит строки из DataFrame на существующую таблицу SQL. Так как мы использовали наши dataframe_difference () Функция найти, какие строки были разными, мы смогли убедиться, что мы только загружены ряды, которые были разными.

Оригинал: “https://dev.to/hackersandslackers/comparing-rows-between-two-pandas-dataframes-7ip”