Используйте комбинации столбцов, чтобы найти несоответствие данных в строках панд - PullRequest
0 голосов
/ 21 ноября 2018

Как лучше всего получить все значения ячеек на основе комбинации значений столбцов?

Пример первого кадра данных:

  Stock                         Name  Price
0    AMD       Advanced Micro Devices    100
1     GE     General Electric Company    200
2    BAC  Bank of America Corporation    300
3   AAPL                   Apple Inc.    500
4   MSFT        Microsoft Corporation   1000
5  GOOGL                Alphabet Inc.   2000

Пример второго кадра данных:

  Stock                         Name  Price
0    AMD       Advanced Micro Devices    100
1     GE     General Electric Company    200
2    BAC  Branch of America Corporation  300
3   AAPL                   Apple Inc.    500
4   MSFT        Microsoft Corporation   1000
5  GOOGL                Alphabet Inc.   2000

Например: я хочу использовать (Stock и Name) в качестве ключевых столбцов, а затем сравнить наборы данных.Цель состоит в том, чтобы напечатать записи о несоответствии между двумя наборами данных со столбцами Stock + Name, используемыми в качестве комбинированного ключа.

Я использую Pandas / Python3.7

Пример вывода:

БАК Банк Америки Корпорация 300 --- БАК Отделение Америки Корпорация 300

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Если они находятся в двух фреймах данных, объединить их без каких-либо условий довольно просто с .concat.Как только они объединены, вот один из способов получить несоответствие:

import pandas as pd

df1 = pd.DataFrame({
    "Ticker_y": list("qwerty"),
    "Name_y": list("asdfgh"),
    "Ticker_x": list("qw3r7y"),
    "Name_x": list("as6f8h")
})

mismatch = df1[(df1["Ticker_y"] != df1["Ticker_x"]) & (df1["Name_y"] != df1["Name_x"])]

В последней строке просто написано "df только при соблюдении этих условий".

0 голосов
/ 21 ноября 2018

Мы можем использовать isin, используя последовательность значений для проверки, поскольку это гарантирует, что каждый элемент в DataFrame содержится в значениях

Первый DataFrame

>>> df1
   Stock                         Name  Price
0    AMD       Advanced Micro Devices    100
1     GE     General Electric Company    200
2    BAC  Bank of America Corporation    300
3   APPL                   Apple Inc.    500
4   MSFT        Microsoft Corporation   1000
5  GOOGL                Alphabet Inc.   2000

Второй фрейм данных

>>> df2
   Stock                           Name  Price
0    AMD         Advanced Micro Devices    100
1     GE       General Electric Company    200
2    BAC  Branch of America Corporation    300
3   APPL                     Apple Inc.    500
4   MSFT          Microsoft Corporation   1000
5  GOOGL                  Alphabet Inc.   2000

Здесь можно перейти ..

>>> df2[~df2.Name.isin(df1.Name.values)]
  Stock                           Name  Price
2   BAC  Branch of America Corporation    300

ИЛИ

>>> df1[~df1.Name.isin(df2.Name.values)]
  Stock                         Name  Price
2   BAC  Bank of America Corporation    300
0 голосов
/ 21 ноября 2018

Возможно, ПОЛНОЕ ВНУТРЕННЕЕ СОЕДИНЕНИЕ с использованием merge + query?

df1.merge(df2, on='Stock').query('Name_x != Name_y')

  Stock                       Name_x  Price_x                         Name_y  Price_y
2   BAC  Bank of America Corporation      300  Branch of America Corporation      300

Или, немного другое решение с map, вы можете использовать для получения стандартных символов:

m = df1.Stock.map(df2.set_index('Stock').Name).ne(df1.Name)
symbols = df1.loc[m, 'Stock']

print(symbols)
2    BAC
Name: Stock, dtype: object

И затем получить доступ к каждой строке DataFrame по символу акции:

df1[df1.Stock.isin(symbols)]
  Stock                         Name  Price
2   BAC  Bank of America Corporation    300

df2[df2.Stock.isin(symbols)]
  Stock                           Name  Price
2   BAC  Branch of America Corporation    300
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...