我有这样的DataFrame:
Index Name Age NestedDict
1 Adam 45 {"Dataobject":[{"Adam":26, "id":69},{"Adam":45, "id":63},{"Adam":40, "id":20}]
2 etc
我想: 对于DF中的每个记录,将Age列中的值与NestedDict列中dict中的每个“ Adam”值进行比较,如果存在匹配项,则将其“ id”值赋给新列,并理想地从dict中删除其他“ Adams”。
我知道我可以通过“应用”来访问字典:
DF.NestedDict.apply(lambda x: x.get("Dataobject")
我试图像这样从字典中获取“亚当”值:
DF.NestedDict.apply(lambda x: [i.get("Adam") for i in x.get("Dataobject")])
这给了我
[26, 45, 40]
但是然后,我不知道如何确定是否要比较列表中的每个值和DF.Age的条件,以及是否存在匹配,然后如何从字典中获取“ id”。
答案 0 :(得分:0)
对zip
使用嵌套列表推导,如果不存在,还返回next
的第一个匹配值和默认字符串no match
:
df['new_id'] = [next(iter([i.get("id") for i in x.get("Dataobject")
if i.get("Adam") == y]), 'no match')
for y, x in zip(df['Age'], df['NestedDict'])]
示例:
d = {"Dataobject":[{"Adam":26, "id":69},{"Adam":45, "id":63},{"Adam":40, "id":20}]}
df = pd.DataFrame({'Age':[45, 40, 38], 'NestedDict':[d, d, d]})
df['new_id'] = [next(iter([i.get("id") for i in x.get("Dataobject")
if i.get("Adam") == y]), 'no match')
for y, x in zip(df['Age'], df['NestedDict'])]
print (df)
Age NestedDict new_id
0 45 {'Dataobject': [{'Adam': 26, 'id': 69}, {'Adam... 63
1 40 {'Dataobject': [{'Adam': 26, 'id': 69}, {'Adam... 20
2 38 {'Dataobject': [{'Adam': 26, 'id': 69}, {'Adam... no match