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更新的解决方案,如果您现在有多个“名称”列,应该更具可扩展性