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