Пд.слияние. ошибка: ValueError: Неверный номер

В «поставщиках» df я пытаюсь создать столбец под названием «Категория без заказа», который будет иметь «Категорию» из «категорий» df на основе значения в столбце «Уникальный».

Вот ДФС:

import pandas as pd

suppliers = pd.DataFrame({'Vendor Number': ['260508', '260525', '260549', '260561','260579','260587'],
                    'Unique': ['26050822015070', '26052522002153', '260549EXPENSE', '260561EXPENSE','2605792972508701C0000','26058738210793']})
categories = pd.DataFrame({'Vendor Number': ['260508', '260525', '260549','260587'],
                    'Unique': ['26050822015070', '26052522002153', '260549EXPENSE','26058738210793'],
                    'Category': ['Maintenance', 'IT','Facilities','Travel Agent']})

Когда я использую:

suppliers['Non-PO Category'] = pd.merge(suppliers, categories[['Unique','Category']], on='Unique', how='left')

или

suppliers['Non-PO Category'] = pd.merge(suppliers, categories, how='left', left_on='Unique', right_on='Unique')

Я получаю сообщение об ошибке: ValueError: неправильное количество переданных элементов 4, размещение подразумевает 1

Заранее спасибо.

Почему вы используете NonPO_Suppliers[['Unique','Category']]? используйте вместо этого: pd.merge(final, NonPO_Suppliers, как=left, left_on=key_of_left_table, right_on=key_on_right_table)

Trics 15.12.2020 15:17

@Трикс. Спасибо. Я внес это изменение, но получил сообщение об ошибке: "Неверное количество элементов, переданных 17, размещение подразумевает 1"?

Adrian 15.12.2020 16:49

@ Андриан, если вы можете предоставить образцы своих фреймов данных, я постараюсь предоставить вам именно то, что вам нужно.

sophocles 15.12.2020 17:25

@sophods Спасибо. Я обновил свой вопрос с помощью dfs и упрощенной постановки задачи.

Adrian 15.12.2020 21:32

@ Андриан Спасибо за это. Пожалуйста, проверьте обновленный ответ ниже. Я думаю, это то, что вам нужно. Дайте мне знать.

sophocles 16.12.2020 10:01
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
247
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Причина, по которой вы получаете сообщение об ошибке, заключается в том, что вы пытаетесь создать новый столбец с помощью pd.merge, в то время как по умолчанию pd.merge возвращает фрейм данных объединенных объектов. Ваш код:

suppliers['Non-PO Category'] = pd.merge(suppliers, categories[['Unique','Category']], on='Unique', how='left')

Следовательно, если вы измените свой код и стремитесь вернуть фрейм данных, например:

new_suppliers = pd.merge(suppliers, categories[['Unique','Category']], on='Unique', how='left')

Вы получите желаемый результат:

new_suppliers
Out[8]: 
  Vendor Number                 Unique      Category
0        260508         26050822015070   Maintenance
1        260525         26052522002153            IT
2        260549          260549EXPENSE    Facilities
3        260561          260561EXPENSE           NaN
4        260579  2605792972508701C0000           NaN
5        260587         26058738210793  Travel Agent

Надеюсь, это ответит на ваш вопрос.

Обратите внимание, что это создает новый фрейм данных. Если вы этого не хотите, вы можете перезаписать предыдущий, просто:

suppliers = pd.merge(suppliers, categories[['Unique','Category']], on='Unique', how='left')

Спасибо! Кажется, что это проверит, присутствуют ли значения из «Уникального» (df «final») в столбце «Уникальный» в df «NonPO_Suppliers» и не вернут значения в категории столбца (из файла «NonPO_Suppliers») для соответствующих значений в столбце Единственный на df "final"? Я хочу узнать категорию из «NonPO_Suppliers» на основе столбца «Уникальный».

Adrian 15.12.2020 16:19

Можете ли вы предоставить образцы ваших двух фреймов данных, чтобы я мог их воспроизвести? Сделайте это в виде словаря, чтобы я мог быстро воссоздать, пожалуйста.

sophocles 15.12.2020 17:02

Большое спасибо! Это работало со словарем, но когда я использую код для создания столбца «Уникальный» в файле «поставщики» (обычно его там нет) с кодом: suppliers['Unique']=suppliers['Vendor Number'].astype(str) + supplier['Vendor Site Code'].astype(str) - и затем выполняю слияние, как вы указали, я получаю «TypeError: строковые индексы должны быть целыми числами». Это потому, что «Уникальный» является буквенно-цифровым, например. "260561EXPENSE", есть идеи, как избежать этой ошибки? Я знаю, что это превышает мой первоначальный вопрос. Должен ли я опубликовать его как новый вопрос и отметить этот вопрос как решенный? Спасибо!

Adrian 16.12.2020 17:03

Да, я думаю, это хороший момент. Отметьте это как решенное и опубликуйте новое. Попробую и новую решить. Просто дайте мне знать, когда вы это сделаете, чтобы я получил уведомление.

sophocles 16.12.2020 17:46

Можете ли вы принять и закрыть вопрос, пожалуйста? Кроме того, вы можете попросить новый.

sophocles 17.12.2020 12:08

Извиняюсь за опоздание. Мне пришлось переписать свой код и найти ссылку на файлы в моем новом вопросе. Я принимаю ответ и, пожалуйста, посмотрите ссылку на мой новый вопрос. Большое спасибо! stackoverflow.com/questions/65346930/…

Adrian 17.12.2020 20:12

Я думаю, что понимаю вопрос к вашему новому. Пожалуйста, проверьте ответ и должен работать :)

sophocles 17.12.2020 20:38

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