Вы можете попробовать использовать collections.ChainMap
в понимании списка:
Из документов ...
ChainMap группирует несколько диктов или других отображений вместе, чтобы создать единое обновляемое представление ...
Итак, сначала мы zip
столбцы вместе, затем вложенный zip
, чтобы получить dicts
из каждого столбца "рядом «в одном списке. Этот список передается в ChainMap
, который объединяет их в один dict
.
Пример
from collections import ChainMap
# Setup
df = pd.DataFrame({'ID': [101, 103], 'Name': ['A', 'B'], 'id2': [[{'a': '1'}, {'b': '2'}], [{'c': '3'}, {'d': '6'}]], 'name2': [[{'e': '4'}, {'f': '5'}], [{'g': '7'}, {'h': '8'}]]})
df['id2'] = [[dict(ChainMap(*x)) for x in zip(i, n)]
for i, n in zip(df['id2'], df['name2'])]
[out]
ID Name id2 name2
0 101 A [{'e': '4', 'a': '1'}, {'b': '2', 'f': '5'}] [{'e': '4'}, {'f': '5'}]
1 103 B [{'c': '3', 'g': '7'}, {'d': '6', 'h': '8'}] [{'g': '7'}, {'h': '8'}]
Обновление
Более масштабируемое решение, если вам нужно объединить несколько столбцов, - сначала использовать DataFrame.filter
, чтобы извлечь все столбцы, которые нужно объединить:
df = pd.DataFrame({'ID': [101, 103], 'Name': ['A', 'B'], 'id2': [[{'a': '1'}, {'b': '2'}], [{'c': '3'}, {'d': '6'}]], 'name2': [[{'e': '4'}, {'f': '5'}], [{'g': '7'}, {'h': '8'}]], 'name3': [[{'x': '4'}, {'y': '5'}], [{'t': '4'}, {'o': '5'}]]})
df['id2'] = [[dict(ChainMap(*y)) for y in zip(*x)]
for x in zip(*df.filter(regex='id2|name').apply(tuple))]
[out]
ID Name id2 name2 name3
0 101 A [{'e': '4', 'x': '4', 'a': '1'}, {'b': '2', 'f': '5', 'y': '5'}] [{'e': '4'}, {'f': '5'}] [{'x': '4'}, {'y': '5'}]
1 103 B [{'c': '3', 't': '4', 'g': '7'}, {'o': '5', 'd': '6', 'h': '8'}] [{'g': '7'}, {'h': '8'}] [{'t': '4'}, {'o': '5'}]
По сути, это то же самое, что и выше, только мы фильтруем столбцы "id" или "name" и объединяем их все.