Как сравнить два кадра данных Pandas и показать различия в DataFrame 2 - PullRequest
0 голосов
/ 30 августа 2018

В настоящее время у меня есть два кадра данных панд:

sales = [{'account': 'Jones LLC', 'Jan': 150, 'Feb': 200, 'Mar': 140},
         {'account': 'Alpha Co',  'Jan': 200, 'Feb': 210, 'Mar': 215}]
sales2 = [{'account': 'Jones LLC', 'Jan': 150, 'Feb': 200, 'Mar': 140},
         {'account': 'Alpha Co',  'Jan': 200, 'Feb': 210, 'Mar': 215},
         {'account': 'Blue Inc',  'Jan': 50,  'Feb': 90,  'Mar': 95 }]
test_1 = pd.DataFrame(sales)
test_2 = pd.DataFrame(sales2)

Чего я хочу добиться, так это показать только различия, которые есть в «test_2», а не в «test_1».

Код, который у меня есть в настоящее время, объединяет два кадра данных и показывает мне общую разницу между обоими кадрами, однако все, что я хочу увидеть, это различия между 'test_2' и 'test_1', а не наоборот:

def compare_dataframes(df1, df2):

    print 'Comparing dataframes...'
    df = pd.concat([df1, df2])
    df = df.reset_index(drop=True)
    df_gpby = df.groupby(list(df.columns))
    idx = [x[0] for x in df_gpby.groups.values() if len(x) == 1]
    compared_data = df.reindex(idx)
    if len(compared_data) > 1:
        print 'No new sales on site!'
    else:
        print 'New sales on site!'
        print(compared_data)

Как я могу адаптировать свою текущую функцию для такой работы?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018
import pandas as pd
import numpy as np
sales = [{'account': 'Jones LLC', 'Jan': 150, 'Feb': 200, 'Mar': 140},
         {'account': 'Alpha Co',  'Jan': 200, 'Feb': 210, 'Mar': 215}]
sales2 = [{'account': 'Jones LLC', 'Jan': 150, 'Feb': 200, 'Mar': 140},
         {'account': 'Alpha Co',  'Jan': 200, 'Feb': 210, 'Mar': 215},
         {'account': 'Blue Inc',  'Jan': 50,  'Feb': 90,  'Mar': 95 }]
test_1 = pd.DataFrame(sales)
test_2 = pd.DataFrame(sales2)
test_3 = test_1.append(test_2).drop_duplicates(keep=False)
print (test_3)

печатает разные строки

0 голосов
/ 30 августа 2018

Используйте merge с внешним соединением и indicator параметр:

df = test_1.merge(test_2, how='outer', indicator=True)
print (df)
   Feb  Jan  Mar    account      _merge
0  200  150  140  Jones LLC        both
1  210  200  215   Alpha Co        both
2   90   50   95   Blue Inc  right_only

И затем фильтровать только right_only строк по boolean indexing:

only2 = df[df['_merge'] == 'right_only']
print (only2)
   Feb  Jan  Mar   account      _merge
2   90   50   95  Blue Inc  right_only

Спасибо @Jon Clements за однострочное решение с обратным вызовом:

only2 = test_1.merge(test_2, how='outer', indicator=True)[lambda r: r._merge == 'right_only']
print (only2)
   Feb  Jan  Mar   account      _merge
2   90   50   95  Blue Inc  right_only

Или используйте query:

only2 = test_1.merge(test_2, how='outer', indicator=True).query("_merge == 'right_only'")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...