Поиск разницы между строками в двух фреймах данных / списках, разница в выводе

#python #excel #pandas

#python #excel #pandas

Вопрос:

Итак, у меня есть лист Excel, и я пытаюсь проанализировать разницу между двумя версиями. В частности, у меня есть два столбца; A и B. Я импортировал в python и с помощью pandas создал для A и B собственные фреймы данных (соответственно называемые dfA и dfB). Здесь они имеют следующее:

key dfA dfB
1 cat bigcat
2 dog smalldog
3 mouse hugemouse
4 child normalchild

Я пытаюсь вывести третий столбец, содержащий разницу в строках между двумя фреймами данных, то есть, по сути, третий фрейм / столбец данных:

 ABdifference
big
small
huge
normal
  

Я изучил возможность использования библиотеки difflib, однако я не думаю, что это приведет к получению результатов в удобочитаемом формате

Я вставлю код того, что у меня есть на данный момент, но это действительно немного, поскольку я некоторое время не кодировал, и я подумал, что это будет проще, чем я думал…

 import pandas as pd
from pandas import ExcelWriter
import difflib

df = pd.read_excel('somesheet.xlsx', sheet_name='Diff')

first= df['A']
second = df['B']
  

я не женат на идее использования pandas и фреймов данных, я просто предположил, что это лучший способ работать с данными Excel.

Если бы кто-нибудь мог помочь в любом случае, это было бы чрезвычайно оценено!

Приветствия

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

1. Вы также должны опубликовать остальные столбцы, мы можем проверить, есть ли keycolumns которые мы можем использовать для простого объединения данных.

2. на самом деле не могу опубликовать необработанные данные, поскольку они чувствительны (и охватывают 8000 строк и 40 столбцов), но я добавлю произвольный ключ к своему сообщению

Ответ №1:

Вы можете использовать Dataframe.apply с lambda функцией:

 print(dfA, 'n')
print(dfB)

    col1
0    cat
1    dog
2  mouse
3  child 

          col2
0       bigcat
1     smalldog
2    hugemouse
3  normalchild
  

Объедините фрейм данных с pd.concat :

 df_combined = pd.concat([dfA, dfB], axis=1)
print(df_combined)
    col1         col2
0    cat       bigcat
1    dog     smalldog
2  mouse    hugemouse
3  child  normalchild
  

Использовать .apply с replace

 df_combined['col'] = df_combined.apply(lambda x: x['col2'].replace(x['col1'], ''), axis=1)

print(df_combined)
    col1         col2     col
0    cat       bigcat     big
1    dog     smalldog   small
2  mouse    hugemouse    huge
3  child  normalchild  normal
  

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

1. эй, спасибо за ответ! к сожалению, я получаю TypeError при применении лямбда-функции: TypeError: объект ‘str’ не может быть интерпретирован как целое число. Меню debug указывает на df_combined['col'] = df_combined.apply(lambda x: x['col2'].replace(x['col1'], ''), axis=1) в качестве источника ошибки.. Что касается ключа, у меня действительно есть ключи, связанные с обеими версиями, которые я сравниваю. Я обновлю свой первоначальный пост

2. Является ли один из столбцов, который вы пытаетесь заменить на integer ? Например, является ли ваше col1 целым числом? @DannyMoncadea

3. Нет, это не целые числа, это все строки. На самом деле я попробовал это один раз с моим набором данных и еще раз с образцами данных, которые я опубликовал, и это вызвало ту же ошибку

Ответ №2:

Вы могли бы попробовать приведенную ниже формулу:

 =IF(FIND(A2,B2)>1,LEFT(B2,FIND(A2,B2)-1),IF(FIND(B2,B2)=1,RIGHT(B2,LEN(B2)-LEN(A2))))
  

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

1. к сожалению, это, похоже, не работает : ( таким образом, мой набор данных не является строго строкой с добавленными символами в конце, и эта функция, похоже, не учитывает это и просматривает длину только с конца