#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
целым числом? @DannyMoncadea3. Нет, это не целые числа, это все строки. На самом деле я попробовал это один раз с моим набором данных и еще раз с образцами данных, которые я опубликовал, и это вызвало ту же ошибку
Ответ №2:
Вы могли бы попробовать приведенную ниже формулу:
=IF(FIND(A2,B2)>1,LEFT(B2,FIND(A2,B2)-1),IF(FIND(B2,B2)=1,RIGHT(B2,LEN(B2)-LEN(A2))))
Комментарии:
1. к сожалению, это, похоже, не работает : ( таким образом, мой набор данных не является строго строкой с добавленными символами в конце, и эта функция, похоже, не учитывает это и просматривает длину только с конца