Как объединить колонки в словаре 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)
Смотрите вывод: