сравните два фрейма данных и получите только не совпадающие значения с именами индексов и столбцов pandas dataframe python

#python #pandas #dataframe

Вопрос:

df1-

 ID Name  Number
0  AAA    123
1  BBB    456
2  CCC    789
 

df2-

 ID Name  Number
0  AAA    123
1  BBB    456
2  CCC    **963**    <----- Non Matching value
 

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

 expected output:
ID Number                        
2  963   
 

кто-нибудь может помочь мне с кодом
, я новичок в панд, пожалуйста, помогите мне
Большое тебе спасибо…

Комментарии:

1. Итак, у вас нет нескольких столбцов, и вы можете принять цитирование [['ID', 'Number']] прямо сейчас ?

2. @seabean спасибо здесь я упомянул фиктивные данные, у меня несколько столбцов и строк, мне нужно только не совпадающее конкретное значение на основе индекса и имени столбца

3. Смотрите мой отредактированный ответ ниже.

4. @seabean Спасибо {в результате он преобразует числа в тип с плавающей точкой, можем ли мы это также исправить} Спасибо

5. По умолчанию для Панд принято рассматривать столбцы со значениями NaN как тип с плавающей точкой. Следовательно, дисплей с форматом float для типа float. Смотрите мое 2-е редактирование ниже, чтобы обрезать все десятичные точки. В любом случае, имейте в виду, что результирующие числа являются строками. Вы не можете далее сопоставлять эти строковые числа с целыми числами. Только для косметической демонстрации

Ответ №1:

Вы можете использовать .merge() с включенным индикатором и фильтровать результат по индикатору следующим образом:

 df3 = df2.merge(df1, how='left', indicator=True)
df3[df3['_merge'] == 'left_only'][['ID', 'Number']]
 

Результат:

    ID  Number
2   2     963
 

Редактировать

Если у вас несколько столбцов и вы не хотите указывать имена столбцов, чтобы подчеркнуть различия, вы можете попробовать:

 df2[(df1 != df2)].dropna(how='all', axis=1).dropna(how='all', axis=0)
 

ДЕМОНСТРАЦИЯ

 df1

   ID Name  Number1  Number2  Number3
0   0  AAA      123       12     1111
1   1  BBB      456       22     2222
2   2  CCC      789       32     3333


df2

   ID Name  Number1  Number2  Number3
0   0  AAA      123       12     1111
1   1  BBB      456       22     2255
2   2  CCC      963       32     3333


df2[df1 != df2].dropna(how='all', axis=1).dropna(how='all', axis=0)


   Number1  Number3
1      NaN   2255.0
2    963.0      NaN
 

Вы можете видеть различия по значениям non_NaN. ID Это индекс слева.

Правка 2

Если все ваши числа являются целыми числами, и вы не хотите, чтобы Панды отображали целые числа в виде типа с плавающей точкой вместе со NaN значениями, вы можете использовать:

 df2[df1 != df2].dropna(how='all', axis=1).dropna(how='all', axis=0).fillna('').astype(str).replace(r'.0', '', regex=True)


  Number1 Number3
1            2255
2     963        
 

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

 df2[df1 != df2].dropna(how='all', axis=1).dropna(how='all', axis=0).astype('Int64')


   Number1  Number3
1     <NA>     2255
2      963     <NA>
 

Комментарии:

1. Привет, Себеан, Большое спасибо, давайте скажем, что у нас более 100 имен столбцов, которые невозможно указать здесь, например [‘Идентификатор’, ‘Номер’]] можем ли мы получить тот же ответ без указания имен заголовков [‘ИДЕНТИФИКАТОР’, ‘Номер’]] Спасибо…

2. @Amareshpuri Если вы не возражаете против просмотра других столбцов, вы можете просто использовать df3[df3['_merge'] == 'left_only']

3. @Amareshpuri Итак, у вас может быть несколько столбцов, и вы хотите отображать только несоответствующие столбцы ? Тогда это совершенно другой вопрос. Пожалуйста, обновите свой вопрос с помощью примеров данных из нескольких столбцов. Спасибо! Я постараюсь над этим поработать.

4. замечательное спасибо, да, я обновлю вопрос. {в результате он преобразует числа в тип с плавающей точкой, можем ли мы это также исправить} Спасибо

Ответ №2:

Вы можете использовать следующее

 df2[df1.Number != df2.Number][['ID', 'Number']]