提问人:vando 提问时间:12/19/2022 最后编辑:DataJanitorvando 更新时间:12/20/2022 访问量:82
嵌套词典列表中的 Pandas 布尔条件
Pandas boolean condition from nested list of dictionaries
问:
[{'id': 123,
'type': 'salary', #Parent node
'tx': 'house',
'sector': 'EU',
'transition': [{'id': 'hash', #Child node
'id': 123,
'type': 'salary',
'tx': 'house' }]},
{'userid': 123,
'type': 'salary', #Parent node
'tx': 'office',
'transition': [{'id': 'hash', # Child node
'id': 123,
'type': 'salary',
'tx': 'office'}]}]
作为 pandas 列 (),我将一些信息存储为字典的嵌套列表,如上例所示。'info'
我试图做的是一个布尔条件,这个列表是否具有以下属性:
- 所有父节点中的任何一个中都有多个
'type' == 'salary'
- 字段在具有
'tx'
'type' == 'salary'
到目前为止,我试图展平列表和过滤器,但它没有解决第一个和第二个节点
a = df.iloc[0].info
values = [item for sublist in [[list(i.values()) for i in a]][0]for item in sublist]
答:
1赞
Bushmaster
12/19/2022
#1
如果要单行解决方案,可以使用:
df['check'] = df['info'].apply(lambda x: True if sum([1 if i['type']=='salary' else 0 for i in x]) > 1 and [i['tx'] for i in x if i['type']=='salary'].count([i['tx'] for i in x if i['type']=='salary'][0]) != len([i['tx'] for i in x if i['type']=='salary']) else False)
或(展开):
def check(x):
total_salary = sum([1 if i['type']=='salary' else 0 for i in x]) # get count of "type": "salary" matches
tx_list = [i['tx'] for i in x if i['type']=='salary'] # get tx values when type==salary
tx_check = tx_list.count(tx_list[0]) != len(tx_list) # check all values are same in tx_list
if total_salary > 1 and tx_check:
return True
else:
return False
df['check'] = df['info'].apply(check)
评论
0赞
vando
12/19/2022
你好!非常感谢您的回答。刚刚编辑的一个条件在具有 .对于这个迟到的更改,我们深表歉意'tx'
'type == salary'
评论