#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']]