Питон. Панды. Объединить

Я написал код, который объединяет файл 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 10.12.2020 23:27

... то есть - ожидается, что вы уже начали (и, таким образом, столкнулись с узкой, конкретной проблемой), прежде чем спрашивать здесь.

Charles Duffy 10.12.2020 23:29

Добавлен код @TomSelleck.

Adrian 11.12.2020 07:44

@Чарльз Даффи Точка взята. Я довольно новичок на этой странице. Я добавил код.

Adrian 11.12.2020 07:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пытаться :

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? Я не совсем понимаю, как это работает? Спасибо.

Adrian 11.12.2020 21:29

«r» относится к строке. После слияния «Цвет» из dfB и dfC становится «Color_x» и «Color_y» соответственно (есть способ принудительно изменить имя, например, Color_B и Color_C). Таким образом, r.Color_x относится к значению цвета из dfB. А r.Color_y относится к dfC. Теперь вы просто выполняете логику: если одно значение «Цвет», используйте другое.

frankr6591 11.12.2020 21:41

Блестящий. Спасибо. Пожалуйста, но как «Цвет» из dfB и dfC становится «Color_x» и «Color_y» соответственно? Этого я не могу понять. Откуда Python знает, что Color_x относится к dfB, а не к dfC, или даже почему он вообще относится к чему-то? Я действительно искал ответ в Интернете... И поиграл с кодом, т.е. изменил Color_x на Color_a и Color_y на Color_b, чтобы увидеть, как это повлияет на вывод, но это только выдало ошибку «Объект серии не имеет атрибута 'Color_b" ...

Adrian 11.12.2020 21:56

Найдите функцию «слияния» — pandas.pydata.org/pandas-docs/stable/reference/api/…

frankr6591 11.12.2020 22:24

В функцию merge() добавьте суффиксы = ['_b', '_c'], тогда вы можете использовать r.color_b и r.color_c.

frankr6591 11.12.2020 22:25

Спасибо! Думаю, я понял. Таким образом, x и y по умолчанию назначаются фрейму данных (dfB) и объекту для слияния (dfC). Теперь это имеет смысл.

Adrian 11.12.2020 22:58

Давайте продолжим обсуждение в чате.

Adrian 11.12.2020 23:26

В предложенном вами коде, как мне его использовать, если в именах моих столбцов есть пробелы, например. «Цвет» теперь «Имя цвета», поэтому у меня это не сработало: «применить (лямбда r: r.Color Name_x, если r.Color Name_y == «Цвет» иначе r.Color Name_y, ось = 1)» или "применить(лямбда r: r['Имя цвета']_x, если r[Имя цвета']_y == 'Цвет', иначе r['Имя цвета']_y, ось=1)" Спасибо.

Adrian 18.12.2020 10:54

используйте «применить (лямбда r: r['Имя цвета_x'], если r[Имя цвета_y'] == 'Цвет', иначе r['Имя цвета_y'], ось = 1)"

frankr6591 18.12.2020 15:34

Спасибо! Я ответил на ваш вопрос в чате, если вы хотите проверить его, пожалуйста. chat.stackoverflow.com/rooms/225844/…

Adrian 18.12.2020 18:27

Другие вопросы по теме