基于嵌套字典列表的Pandas布尔条件判断技术问询
问题描述
我的Pandas数据框包含一列名为info,该列存储嵌套字典列表,示例如下:
[{'id': 123, 'type': 'salary', # 父节点 'tx': 'house', 'sector': 'EU', 'transition': [{'id': 'hash', # 子节点 'id': 123, 'type': 'salary', 'tx': 'house' }]}, {'userid': 123, 'type': 'salary', # 父节点 'tx': 'office', 'transition': [{'id': 'hash', # 子节点 'id': 123, 'type': 'salary', 'tx': 'office'}]}]
需要判断该列表是否同时满足以下两个条件:
- 父节点中存在多个
type等于'salary'的项 - 所有
type等于'salary'的父节点中,tx字段的值存在不同的情况
我尝试过扁平化列表过滤的方法,但未实现需求,尝试的代码如下:
a = df.iloc[0].info values = [item for sublist in [[list(i.values()) for i in a]][0]for item in sublist]
解决方案
无需扁平化整个列表,直接针对父节点提取关键信息即可实现判断:
单条数据判断逻辑
先从info列表中筛选出父节点里type == 'salary'的项,再分别验证两个条件:
# 取单条数据示例 info_list = df.iloc[0]['info'] # 筛选父节点中type为salary的项 salary_parents = [item for item in info_list if item.get('type') == 'salary'] # 条件1:salary类型的父节点数量大于1 condition1 = len(salary_parents) > 1 # 条件2:tx值存在差异(集合去重后数量大于1) condition2 = len({parent['tx'] for parent in salary_parents}) > 1 # 最终布尔结果 result = condition1 and condition2
整列数据批量判断
如果要对DataFrame每一行都执行该判断,可封装函数后用apply批量处理:
def check_salary_conditions(info_list): salary_parents = [item for item in info_list if item.get('type') == 'salary'] # 先判断条件1,不满足直接返回False,减少计算 if len(salary_parents) <= 1: return False # 验证条件2 return len({parent['tx'] for parent in salary_parents}) > 1 # 生成新列存储每行的判断结果 df['meets_conditions'] = df['info'].apply(check_salary_conditions)
代码说明
- 用
item.get('type')替代直接索引,避免因父节点缺少type字段抛出异常 - 利用集合自动去重的特性,快速判断
tx值是否存在差异,效率高于逐一遍历对比 - 优先判断条件1,不满足时直接返回结果,减少不必要的计算开销
内容的提问来源于stack exchange,提问作者vando
相关产品推荐
相关产品推荐

