Это сказка, так как время, как время: у вашей компании есть несколько экземпляров того же набора данных, который Должен Матч, но по любой причине, не делать. Очевидный пример, который приходит к уму, может быть расхождение между окружающими условиями: ваша положенная среда, вероятно, выпадает из синхронизации с производством часто. Это легкая проблема для решения, потому что это понятно Почему Эти типы систем выходят из синхронизации. Решение проблемы простой, как синхронизация одной системы к другой, как правило, когда одна система служит «источником истины». «Но как насчет несоответствий между системами без источник правды? Что мы делаем, когда параллельные системы должны иметь сопоставимые данные, но нет? Наконец, как мы можем выяснить, что пошло не так?
Компании склонны к тонам сценариев для этой точной проблемы, и они обычно такие ситуации, которые являются смертельными, когда нерешены. Например, скажем, ваша компания отслеживает новые напросы, добавив их в систему 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 вопросов:
- Какие строки присутствовали только в первом DataFrame?
- Какие строки присутствовали только во втором DataFrame?
- Какие строки присутствовали в обоих данных?
- Какие ряды были не присутствует в обоих данных, но присутствует в одном из них?
Для начала наша функция 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”