Создание словарей из значений в столбцах pandas с повторяющимися значениями

Учитывая этот образец данных:

   location emp
0   fac_1   emp1
1   fac_2   emp2
2   fac_2   emp3
3   fac_3   emp4
4   fac_4   emp5

Его можно воссоздать с помощью этого кода:

 sample_dict = {'location':['fac_1', 'fac_2', 'fac_2', 'fac_3', 'fac_4'], 'emp':['emp1', 'emp2', 'emp3', 'emp4', 'emp5']}
data = pd.DataFrame(sample_dict)

Я пытаюсь создать словарь со значениями каждого уникального «fac» и всех связанных значений emp. В некоторых рядах есть только один fac и один emp, так что в этом нет ничего страшного. Во многих строках, как в примере, есть два разных значения emp для одного значения fac. (См. fac_2 в образце данных).

Желаемый результат - это один словарь, подобный этому:

{fac_1:emp1, fac_2:[emp2, emp3], fac_3:emp4, fac_4:emp5}

Я смог добиться этого, но с помощью запутанного маршрута, в котором я уверен, у кого-то здесь есть более эффективный и менее подверженный ошибкам способ достижения. Короче говоря, я сгруппировал свой df по fac, а затем использовал iloc, чтобы получить имя fac, и функцию .to_list(), чтобы получить все значения emp в списке, а затем объединить это в словарь.

Что-то вроде этого:

location = data.iloc[0,1]
emp_lst= data['emp'].to_list()
fac_dict = {facility:np_lst}

У кого-то, кто умеет делать словари из фреймов данных pandas, я уверен, есть более эффективный способ добиться желаемого результата. Спасибо, что заглянули!

Почему в 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
0
25
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ты можешь попробовать

out = data.groupby('location')['emp'].agg(lambda col: list(col) if len(col) >= 2 else col).to_dict()
print(out)

{'fac_1': 'emp1', 'fac_2': ['emp2', 'emp3'], 'fac_3': 'emp4', 'fac_4': 'emp5'}

Спасибо, что нашли время ответить на этот вопрос. Сообщество SO оказало огромную поддержку моему путешествию по программированию, поскольку такие люди, как вы и bert2me, ответили на этот вопрос.

John Taylor 06.05.2022 22:12
Ответ принят как подходящий
data.groupby('location')['emp'].agg(list).to_dict()

Выход:

{'fac_1': ['emp1'], 'fac_2': ['emp2', 'emp3'], 'fac_3': ['emp4'], 'fac_4': ['emp5']}

Хорошо, так это гениально! Работал отлично. Огромное спасибо!

John Taylor 06.05.2022 22:11

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

BeRT2me 06.05.2022 22:15

Да, судя по моему вопросу, вы правы. Увидев ваши ответы, я понял, что мне действительно нужно, чтобы каждое значение было списком, даже если это только одно значение, поэтому я могу перебирать словарь в более позднем коде. Еще раз спасибо!

John Taylor 06.05.2022 22:17

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