在熊猫中嵌套“ if”条件:将一列中的值与另一列中的int dict进行比较

时间:2018-10-15 05:35:34

标签: python pandas dictionary

我有这样的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”。

1 个答案:

答案 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