#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