Я написал код, который объединяет файл B в файл A на основе столбца «Код». Однако некоторые значения из файла B являются общими («Цвет»), и мне нужно будет выполнить еще одно слияние с файлом C, но вместо создания нового столбца я хотел бы использовать тот же столбец, созданный во время первого слияния и всякий раз, когда первое слияние возвращает значение «Цвет» только для этих строк, они объединяются с файлом C, чтобы получить правильное значение.
Я дошел до слияния A с B:
import pandas as pd
File_A = pd.read_excel(r'.../My Files/Python/Supplier cat testing/File A.xlsx')
File_B = pd.read_excel(r'.../My Files/Python/Supplier cat testing/File B.xlsx')
File_C = pd.read_excel(r'.../My Files/Python/Supplier cat testing/File C.xlsx')
results = pd.merge(File_A, File_B[['Code','Color']], on='Code')
results.to_excel('Output_File.xlsx', index=False)
Кто-нибудь знает, с чего мне вообще начать, пожалуйста?
... то есть - ожидается, что вы уже начали (и, таким образом, столкнулись с узкой, конкретной проблемой), прежде чем спрашивать здесь.
Добавлен код @TomSelleck.
@Чарльз Даффи Точка взята. Я довольно новичок на этой странице. Я добавил код.
Пытаться :
dfOut = dfB.copy()
dfOut['Color'] = dfB.merge(dfC, on='Code').apply(lambda r: r.Color_x if r.Color_y == 'Color' else r.Color_y, axis=1)
print(df)
Code Color
0 0 Green
1 1 Yellow
2 2 Orange
3 3 Red
4 4 Black
Большое спасибо. Это сработало. Таким образом, код в основном создает выходной файл как копию dfB, а затем объединяет его с dfC в коде, заменяя значения в столбце «Цвет» в файле dfB, выполняя слияние с dfC в столбцах «Код», а затем с использованием условного оператора с лямбдой всякий раз, когда значение «Цвет», он использует правильный цвет из dfC? Используйте r.Color_x, если r.Color_y == 'Color', иначе используйте r.Color_y. Что такое: r.Color_x и r.Color_y? Я не совсем понимаю, как это работает? Спасибо.
«r» относится к строке. После слияния «Цвет» из dfB и dfC становится «Color_x» и «Color_y» соответственно (есть способ принудительно изменить имя, например, Color_B и Color_C). Таким образом, r.Color_x относится к значению цвета из dfB. А r.Color_y относится к dfC. Теперь вы просто выполняете логику: если одно значение «Цвет», используйте другое.
Блестящий. Спасибо. Пожалуйста, но как «Цвет» из dfB и dfC становится «Color_x» и «Color_y» соответственно? Этого я не могу понять. Откуда Python знает, что Color_x относится к dfB, а не к dfC, или даже почему он вообще относится к чему-то? Я действительно искал ответ в Интернете... И поиграл с кодом, т.е. изменил Color_x на Color_a и Color_y на Color_b, чтобы увидеть, как это повлияет на вывод, но это только выдало ошибку «Объект серии не имеет атрибута 'Color_b" ...
Найдите функцию «слияния» — pandas.pydata.org/pandas-docs/stable/reference/api/…
В функцию merge() добавьте суффиксы = ['_b', '_c'], тогда вы можете использовать r.color_b и r.color_c.
Спасибо! Думаю, я понял. Таким образом, x и y по умолчанию назначаются фрейму данных (dfB) и объекту для слияния (dfC). Теперь это имеет смысл.
Давайте продолжим обсуждение в чате.
В предложенном вами коде, как мне его использовать, если в именах моих столбцов есть пробелы, например. «Цвет» теперь «Имя цвета», поэтому у меня это не сработало: «применить (лямбда r: r.Color Name_x, если r.Color Name_y == «Цвет» иначе r.Color Name_y, ось = 1)» или "применить(лямбда r: r['Имя цвета']_x, если r[Имя цвета']_y == 'Цвет', иначе r['Имя цвета']_y, ось=1)" Спасибо.
используйте «применить (лямбда r: r['Имя цвета_x'], если r[Имя цвета_y'] == 'Цвет', иначе r['Имя цвета_y'], ось = 1)"
Спасибо! Я ответил на ваш вопрос в чате, если вы хотите проверить его, пожалуйста. chat.stackoverflow.com/rooms/225844/…
Можете ли вы опубликовать свой код?