Python 布尔掩蔽每个行中不同长度的列表

Python 布尔掩蔽每个行中不同长度的列表,python,pandas,boolean,iteration,Python,Pandas,Boolean,Iteration,我有以下数据帧: df=pd.DataFrame({ “标签”:[ [{'id':1401},{'id':1801}], [{'id':502},{'id':703},{'id':1801}], [{'id':1801}] ] }) 我只对'tags'列中的'id':1801值感兴趣,如果'id':1801存在,我想创建一个包含True的新列,如果'id':1801不存在,则包含False 如果性能对get测试很重要,并且id缺失,则非常感谢将lambda函数与Any一起使用: df = pd

我有以下数据帧:

df=pd.DataFrame({
“标签”:[
[{'id':1401},{'id':1801}],
[{'id':502},{'id':703},{'id':1801}],
[{'id':1801}]
]
})
我只对
'tags'
列中的
'id':1801
值感兴趣,如果
'id':1801
存在,我想创建一个包含
True
的新列,如果
'id':1801
不存在,则包含
False


如果性能对
get
测试很重要,并且
id
缺失,则非常感谢将lambda函数与
Any一起使用:

df = pd.DataFrame({
    'tags': [
        [{'id': 1401}, {'id': 1801}],
        [{'id': 502}, {'id': 703}, {'id': 1801}],
        [{'id': 1}]
    ]
})

df['new'] = df['tags'].apply(lambda x: any(y.get('id') == 1801 for y in x))
print (df)
                                       tags    new
0              [{'id': 1401}, {'id': 1801}]   True
1  [{'id': 502}, {'id': 703}, {'id': 1801}]   True
2                               [{'id': 1}]  False

如果始终根据标签
存在
id

In [283]: %timeit [any(d['id'] == 1801 for d in l) for l in df['tags']]
2.44 ms ± 215 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

我们可以
分解
标记
列,然后使用
str
accesor获取
id
的值,并将其与
1801
进行比较,以创建一个布尔掩码,然后在
级别=0
上创建
任意
,以减少:

df['flag'] = df['tags'].explode().str['id'].eq(1801).any(level=0)
如果dataframe很大,需要考虑性能,那么我们可以使用
列表理解
,这将优于所有可用的基于pandas的解决方案

df['flags'] = [any(d['id'] == 1801 for d in l) for l in df['tags']]

df['flags'] = [any(d['id'] == 1801 for d in l) for l in df['tags']]
                                       tags  flag
0              [{'id': 1401}, {'id': 1801}]  True
1  [{'id': 502}, {'id': 703}, {'id': 1801}]  True
2                            [{'id': 1801}]  True