嵌套词典列表中的 Pandas 布尔条件

Pandas boolean condition from nested list of dictionaries

提问人:vando 提问时间:12/19/2022 最后编辑:DataJanitorvando 更新时间:12/20/2022 访问量:82

问:

 [{'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'

我试图做的是一个布尔条件,这个列表是否具有以下属性:

  1. 所有父节点中的任何一个中都有多个'type' == 'salary'
  2. 字段在具有'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] 
pandas list dictionary 嵌套列表

评论


答:

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'