Python 如何编辑此数据框以合并两列字典列表?

Python 如何编辑此数据框以合并两列字典列表?,python,pandas,list,pandas-groupby,Python,Pandas,List,Pandas Groupby,我有一个这样的数据帧 ID Name id2 name2 name3 101 A [{'a': '1'}, {'b': '2'}] [{'e': '4'}, {'f': '5'}] [{'x': '4'}, {'y': '5'}] 103 B [{'c': '3'},{'d': '6'}] [{'g': '7'},{'h': '8'}] [{'t': '4'}, {'o': '5

我有一个这样的数据帧

ID  Name id2                            name2                  name3
101  A    [{'a': '1'}, {'b': '2'}]  [{'e': '4'}, {'f': '5'}]  [{'x': '4'}, {'y': '5'}]
103  B    [{'c': '3'},{'d': '6'}]   [{'g': '7'},{'h': '8'}]   [{'t': '4'}, {'o': '5'}]
ID   Name id2                                                                name2
101  A    [{'a': '1','e': '4','x': '4'}, {'b': '2', 'f': '5','y': '5'}}]    [{'e': '4'}, {'f': '5'}]
103  B    [{'c': '3', 'g': '7','t': '4'},{'d': '6', 'h': '8','o': '5'}]    [{'e': '4'}, {'f': '5'}]
我想要这样的输出df

ID  Name id2                            name2                  name3
101  A    [{'a': '1'}, {'b': '2'}]  [{'e': '4'}, {'f': '5'}]  [{'x': '4'}, {'y': '5'}]
103  B    [{'c': '3'},{'d': '6'}]   [{'g': '7'},{'h': '8'}]   [{'t': '4'}, {'o': '5'}]
ID   Name id2                                                                name2
101  A    [{'a': '1','e': '4','x': '4'}, {'b': '2', 'f': '5','y': '5'}}]    [{'e': '4'}, {'f': '5'}]
103  B    [{'c': '3', 'g': '7','t': '4'},{'d': '6', 'h': '8','o': '5'}]    [{'e': '4'}, {'f': '5'}]
列名3将与Op中的相同,我刚刚从上面的示例中删除了它。问题是,即使添加了更多列,其字典也会在id2列中更新。 谢谢:)

您可以尝试在列表中使用:

从文件中

ChainMap将多个DICT或其他映射组合在一起,以创建一个可更新的视图

因此,首先我们将
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'])]
[外]


更新 如果要合并多个列,则更具可扩展性的解决方案是首先提取需要合并的所有列:

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))]
[外]


这与上面的操作基本相同,只是我们过滤到“id”或“name”列,并将它们全部组合起来。

考虑到数据帧的名称是df,请尝试以下操作:

i=0
for i in range(0,df.shape[0]):
    df.id2[i][0].update(df.name2[i][0])
    df.id2[i][1].update(df.name2[i][1])

<代码>如果有另一列出现在之后,你能更好地解释吗?@ YATU你可以考虑只有4列。谢谢你@ ChrisA今天救了我。如果您有时间,请您详细解释一下代码好吗?嘿@R.singh我实际上添加了另一个官方解决方案,它比使用
dict.update
谢谢您@Chris如果您有时间,请您解释一下代码好吗?我已经尝试过这个方法[[(x.update(y)]在zip中为x,y(I,n)]在zip中为I,n(df2['id2',df2['name2])]这就像一个符咒。再次感谢Chrisi已经更新了问题,以便将来进行一些修改,您能建议吗?@R.singh更新的解决方案,如果您现在有多个“名称”列,应该更具可扩展性