Получение ошибки при попытке объединить в Pandas 2 CSV-файла с повторяющимися индексами

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я новичок в python. Я пытаюсь объединить 2 CSV-файла, чтобы выяснить различия. Я использую столбец Id в качестве индекса для объединения значений. Поскольку файлы Csv имеют повторяющиеся идентификаторы, я получаю следующую ошибку: ValueError: форма передаваемых значений равна (17, 4), индексы подразумевают (13, 4)

Ошибка находится на линии:

 df_all_changes = pd.concat([old, new],axis=1,keys=['src','tgt'], join='inner')
 

Q1: Как справиться / исправить вышеуказанную ошибку? Может кто-нибудь, пожалуйста, помочь

Q2: Также я хочу знать, что делает строка ниже:

 df_changed = df_all_changes.groupby(level=0, axis=0).apply(lambda frame: frame.apply(report_diff, axis=1))
 

Q3: что произойдет, если я дам level=1, axis = 1 в приведенной выше строке?

  import pandas as pd

#list of key column(s)
key=['Id']

# Read in the two excel files and fill NA
old = pd.read_csv('Source.csv')
new = pd.read_csv('Target.csv')

#set index
old=old.set_index(key)
new=new.set_index(key)

#identify dropped rows and added (new) rows
dropped_rows = set(old.index) - set(new.index)
added_rows = set(new.index) - set(old.index)
#print(old.loc[dropped_rows])

#combine data
df_all_changes = pd.concat([old,new],axis=1,keys=['src','tgt'],join='inner')
print(df_all_changes)

#swap column indexes
df_all_changes = df_all_changes.swaplevel(axis='columns')#[new.columns[0:]]


#prepare functio for comparing old values and new values
def report_diff(x):
    return x[0] if x[0] == x[1] else '{} ---> {}'.format(*x)

#apply the report_diff function
df_changed = df_all_changes.groupby(level=0, axis=0).apply(lambda frame: frame.apply(report_diff, axis=1))
print(df_changed)
 

введите описание изображения здесь

введите описание изображения здесь

Ответ №1:

Возможно, вы захотите привести примеры того, как выглядит фрейм данных;

Q1 — поскольку два фрейма данных не имеют одинакового количества строк, вместо использования pd.concat предлагается использовать pd.merge :

 df_all_changes pd.merge(new, old, on=['src', 'tgt'], how='inner')
 

Вопрос 2

  • уровень = 0 означает, что вы хотите сгруппировать по первому иерархическому индексу; и
  • axis = 0 означает, что вы хотите разделить по уровню строк (это настройка по умолчанию)

вам следует ознакомиться с документацией. и .apply() просто применяет вашу пользовательскую функцию, в которой вы сравниваете старые и новые значения по столбцам (axis = 1).

Q3 — упомянутый выше в Q2.

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

1. Привет, код работает, если у меня есть уникальные ключи, несмотря на то, что количество строк отличается. Я уже пробовал merge раньше, но использование merge создает проблему в строке, где я использую Swaplevel Я добавлю фреймы данных в свой вопрос #поменять индексы столбцов df_all_changes = df_all_changes.swaplevel(axis=’columns’)#[new.columns[0:]]

2. Если я использую слияние и комментирую вышеупомянутую строку Swaplevel, это выдает ошибку в строке, где я использую Apply / Lambda