Python 嵌套的;如果;熊猫中的条件:将一列中的值与另一列中的int dict值进行比较
我有这样的数据帧:Python 嵌套的;如果;熊猫中的条件:将一列中的值与另一列中的int dict值进行比较,python,pandas,dictionary,Python,Pandas,Dictionary,我有这样的数据帧: Index Name Age NestedDict 1 Adam 45 {"Dataobject":[{"Adam":26, "id":69},{"Adam":45, "id":63},{"Adam":40, "id":20}] 2 etc 我想: 对于DF中的每个记录,将年龄列中的值与嵌套dict列中dict中的每个“Adam”值进行比较,如果存在匹配项,则将其“id”值分配给新列,理想情况下从dict中删除其他“Adam” 我知道我可以通过
Index Name Age NestedDict
1 Adam 45 {"Dataobject":[{"Adam":26, "id":69},{"Adam":45, "id":63},{"Adam":40, "id":20}]
2 etc
我想:
对于DF中的每个记录,将年龄列中的值与嵌套dict列中dict中的每个“Adam”值进行比较,如果存在匹配项,则将其“id”值分配给新列,理想情况下从dict中删除其他“Adam”
我知道我可以通过“应用”访问dict:
我试着从格言中得到“亚当”值,如下所示:
DF.NestedDict.apply(lambda x: [i.get("Adam") for i in x.get("Dataobject")])
这让我
[26, 45, 40]
但是,我不知道如何设置if条件来将列表中的每个值与DF.Age进行比较,如果存在匹配项,那么如何从dict中获取“id”。使用嵌套列表理解和
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
是否在一行中始终存在该年龄值的匹配记录?每个记录在列中都有年龄值,但字典中可能没有匹配/对应的值(如果没有匹配,最好将“不匹配”值指定给DF)
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