Python pandas如何为DataFrame新列填充colA中不在指定列表的元素
问题根因
你写的列表推导逻辑层级错误:当前写法是遍历colA列的每一个行值(也就是每一个完整列表),判断整个列表对象是否在你的指定过滤列表中,并没有深入到每个行内列表的元素层级做筛选。由于你存储的是列表对象,和过滤列表里的字符串元素类型不匹配,所有行的列表都会被判定为「不在过滤列表中」,因此最终生成的列和原列完全一致。
另外注意不要用List作为变量名,会和Python内置的列表类型命名冲突,容易引发奇怪的报错。
正确实现方案
使用apply做逐行处理,在每行的列表内部做元素过滤即可,完整示例代码如下:
import pandas as pd # 构造示例数据 d = {'colA': [['UVB', 'NER', 'GGR'], ['KO'], ['ERK1', 'ERK2'], []]} df = pd.DataFrame(data=d) # 替换为你实际需要排除的指定次级列表 exclude_items = ['NER', 'KO'] # 数据量大时转集合可以大幅提升成员判断效率 exclude_set = set(exclude_items) # 逐行过滤行内列表元素,生成新列 df['colB'] = df['colA'].apply(lambda row_list: [item for item in row_list if item not in exclude_set])
运行后得到的DataFrame内容如下:
| colA | colB |
|---|---|
| ['UVB', 'NER', 'GGR'] | ['UVB', 'GGR'] |
| ['KO'] | [] |
| ['ERK1', 'ERK2'] | ['ERK1', 'ERK2'] |
| [] | [] |
注意事项
- 不要尝试用整列级的列表推导直接处理嵌套列表列,必须下沉到每个行的列表内部做元素遍历过滤
- 当过滤列表长度超过100时,转
set再做成员判断的性能会远高于直接用列表判断,推荐优先转集合使用
内容的提问来源于stack exchange,提问作者AmyGrim
相关产品推荐
相关产品推荐

