Как объединить колонки в словаре python, где определенные поля одинаковы?

У меня есть список словарей, как вы можете видеть ниже:

[{
  'name': 'First Filter',
  'nut': '122222',
  'cpv': '111'
},
{
  'name': 'First Filter',
  'nut': '122222',
  'cpv': '123'
},
{
  'name': 'First Filter',
  'nut': '123-41',
  'cpv': '111'
},
{
  'name': 'First Filter',
  'nut': '123-41',
  'cpv': '123'
},
{
  'name': 'second Filter',
  'nut': '123-41',
  'cpv': '123'
}
]

Я хочу получить такие результаты:

{
  'name': 'First Filter',
  'nut': ['122222', '123-41'],
  'cpv': ['111', '123']
},
{
  'name': 'second Filter',
  'nut': ['123-41'],
  'cpv': ['123']
}
]

Пожалуйста, помогите мне, я пытался сделать это с помощью pandas dataframe, но не смог! Я хочу сравнить объекты на основе имени фильтра, а затем объединить cpv и nuts с тем же именем

Я выбрал set вместо list, но вы можете заменить set на list и set.add на list.append соответственно.

from collections import defaultdict
from pprint import pprint

input_list = [
    {
      'name': 'First Filter',
      'nut': '122222',
      'cpv': '111'
    },
    {
      'name': 'Second Filter',
      'nut': '122222',
      'cpv': '123'
    },
    {
      'name': 'First Filter',
      'nut': '123-41',
      'cpv': '111'
    },
        {
      'name': 'Second Filter',
      'nut': '123-41',
      'cpv': '123'
    }
]

res = defaultdict(lambda: defaultdict(set))
for d in input_list:
    for k in [x for x in d.keys() if x != 'name']:
        res[d['name']][k].add(d[k])
pprint(res)

Выход:

defaultdict(<function <lambda> at 0x7fba735681f0>,
            {'First Filter': defaultdict(<class 'set'>,
                                         {'cpv': {'111'},
                                          'nut': {'123-41', '122222'}}),
             'Second Filter': defaultdict(<class 'set'>,
                                          {'cpv': {'123'},
                                           'nut': {'123-41', '122222'}})})

Я использовал collections.defaultdict, потому что в стандартном Python dict мне пришлось бы каждый раз проверять, присутствует ли уже ключ или нет.

Вы можете узнать больше о collections.defaultdict здесь ..

Вот мой код без установки какой-либо библиотеки.

Ваши данные:

stack_list = [{
  'name': 'First Filter',
  'nut': '122222',
  'cpv': '111'
},
{
  'name': 'Second Filter',
  'nut': '133333',
  'cpv': '13444'
},
{
  'name': 'First Filter',
  'nut': '123-41',
  'cpv': '111'
},
{
  'name': 'First Filter',
  'nut': '123-41',
  'cpv': '123'
},
{
  'name': 'Second Filter',
  'nut': '123-41',
  'cpv': '123'
},
{
  'name': 'Second Filter',
  'nut': '133333',
  'cpv': '13444'
},
{
  'name': 'Third Filter',
  'nut': '4444',
  'cpv': '1333311'
},
{
  'name': 'Fourth Filter',
  'nut': '352-235',
  'cpv': '4444'
},
{
  'name': 'Third Filter',
  'nut': '243246-41',
  'cpv': '2566'
}
]

Код таков:

stack_name_values_list = [] # collect all names' values in your data
new_stack_dict = {} # first create dict of each data
new_stack_list = [] # and then add it in to a list
nut= [] # to collect concurrent nuts
cpv=[] # to collect concurrent cpvs

for a in stack_list:
    for k,v in a.items():
        if k == "name" and v not in stack_name_values_list:
            stack_name_values_list.append(v)

for i in stack_name_values_list:
    for j in stack_list:
        if i == j["name"]:
            new_stack_dict["name"] = i
            if j["nut"] not in nut:
                nut.append(j["nut"])
            if j["cpv"] not in cpv:
                cpv.append(j["cpv"])

        new_stack_dict["nut"] = nut
        new_stack_dict["cpv"] = cpv
    
    new_stack_list.append(new_stack_dict)
    new_stack_dict = {}
    nut=[]
    cpv=[]

print(new_stack_list)

Смотрите вывод:

enter image description here

Вернуться на верх