Отображение общих элементов и различий двух фреймов данных разного размера.

У меня есть 2 DataFrames, содержащие строковые значения. Они также имеют разные размеры. Я хотел бы отобразить общие элементы и различия между двумя кадрами данных.

Мой подход таков: я создал функцию сравнения (DataFrame1, DataFrame2), которая будет сравнивать с использованием метода equals 2 DataFrames. Если они одинаковы, то мне больше не нужно искать различия. Мне нужна вторая функция, которая действительно покажет различия между DataFrames. Может ли кто-нибудь помочь мне продолжить?

def test2_expansion():
    test1 = graph.run('match (n:Disease)-[:HAS_CHILD]->(m:Disease) where n.id ="C0039446" return distinct m.id order by m.id;')
    test1 = pd.DataFrame(test1.data())
    return test1

g = test2_expansion()
g = g.to_dict(orient='list')
print ("The result of test 2 for expansion in Neo4j is ")
for key, value in g.items():
    for n in value:
        print(n)


def compareResults(a,b):
    if a.equals(b):
        return True
    else:
        return False

def takeDifferences():
     a = "Search differences"
     if (compareResult() == True):
        return "Amaizing!"
     else:
        return a


DataFrame1       
C0494228             
C0272078
C2242772

DataFrame2
C2242772
C1882062
C1579212
C1541065
C1306459
C0442867
C0349036
C0343748
C0027651
C0272078

Display Common Elements: C0272078 C2242772
Elements found only in DataFrame1:C0494228
Elements found only in DataFrame2:C2242772
C1882062
C1579212
C1541065
C1306459
C0442867
C0349036
C0343748
C0027651

вот как я получаю результат DataFrame: g = dataFrame1() g = g.to_dict(orient='list') print ("Результат теста 2 для расширения в Neo4j") для ключа, значение в g. items(): для n в значении: print(n)

Stetco Oana 22.05.2019 12:34
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
1
499
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если есть кадры данных с одинаковыми столбцами - например. m.id используйте DataFrame.merge с параметром indicator:

df = df1.merge(df2, how='outer', indicator=True)
print (df)
        m.id      _merge
0   C0494228   left_only
1   C0272078        both
2   C2242772        both
3   C1882062  right_only
4   C1579212  right_only
5   C1541065  right_only
6   C1306459  right_only
7   C0442867  right_only
8   C0349036  right_only
9   C0343748  right_only
10  C0027651  right_only

А затем отфильтровать по boolean indexing:

a = df.loc[df['_merge'] == 'both', 'm.id']
b = df.loc[df['_merge'] == 'left_only', 'm.id']
c = df.loc[df['_merge'] == 'right_only', 'm.id']

Значения последнего соединения с f-strings:

print (f'Display Common Element: {", ".join(a)}')
Display Common Element: C0272078, C2242772

print (f'Elements found only in DataFrame1: {", ".join(b)}')
Elements found only in DataFrame1: C0494228

print (f'Elements found only in DataFrame2: {", ".join(c)}')
Elements found only in DataFrame2: C1882062, C1579212, C1541065, 
                                   C1306459, C0442867, C0349036, 
                                   C0343748, C0027651

все работает до фильтрации. затем я получаю сообщение об ошибке: KeyError: «метка [столбец] не находится в [столбцах]»

Stetco Oana 22.05.2019 12:45

@StetcoOana - Что такое print (df1.info()) и print (df2.info())?

jezrael 22.05.2019 12:54

<class 'pandas.core.frame.DataFrame'> RangeIndex: 49 записей, от 0 до 48 столбцов данных (всего 1 столбец): m.id 49 ненулевых типов объектов: объект (1) использование памяти: 472,0+ байта Нет < class 'pandas.core.frame.DataFrame'> RangeIndex: 39 записей, от 0 до 38 столбцов данных (всего 1 столбец): m.id 39 непустых объектов dtypes: объект (1) использование памяти: 392,0+ байт Нет [Готово через 3,445 с]

Stetco Oana 22.05.2019 14:41

да. мои DataFrames имеют только один столбец с этой строкой.

Stetco Oana 22.05.2019 14:46

и несколько строк с одним столбцом, содержащим эту строку

Stetco Oana 22.05.2019 14:47

m.id — это имя столбца

Stetco Oana 22.05.2019 14:48

в обоих кадрах данных у меня есть m.id, который является именем столбца. оба dataFrames имеют индексы.

Stetco Oana 22.05.2019 14:52

@StetcoOana - Да, в ответе было изменено col на m.id, так что теперь все должно работать хорошо.

jezrael 22.05.2019 14:52
Ответ принят как подходящий

Теперь я могу показать вам свою общую функцию, которая ответит на мой вопрос.

def compare(a,b):
    if a.equals(b):
        print("SAME!")
    else:
        df = a.merge(b, how='outer',indicator=True)
        x = df.loc[df['_merge'] == 'both', 'm.id']
        y = df.loc[df['_merge'] == 'left_only', 'm.id']
        z = df.loc[df['_merge'] == 'right_only', 'm.id']
        print (f'Display Common Element: {", ".join(x)}')
        print (f'Elements found only in DataFrame1: {", ".join(y)}')
        print (f'Elements found only in DataFrame2: {", ".join(z)}')

В этот момент моя функция возвращает None, потому что я не знаю, должен ли я что-то возвращать, но она работает отлично. Спасибо @jezrael

Другие вопросы по теме