DataFrame中phase为2/3的id与list_ids交叉匹配处理需求
筛选list_ids中对应phase为2或3的id列表
嘿,这就给你搞定这个筛选需求!咱们一步步来:
1. 先把你的数据转换成可操作的DataFrame
首先咱们先把你给出的表格转换成Pandas DataFrame,方便后续处理:
import pandas as pd # 按照你的数据构造DataFrame data = { 'phase': [1, 3, 3, 2, 3, 1, 1, 2, 1], 'list_ids': [['a1','a2','c3'], ['a1','b2','c3'], ['a2','b2'], ['b1','b2','c1'], ['b2','c1'], ['a1','a2','c3'], ['a1','b1','c4'], ['c1','c2','c4'], ['c1','c2']] } df = pd.DataFrame(data, index=['a1', 'a2', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3', 'c4'])
2. 核心筛选逻辑实现
咱们的思路很清晰:
- 先找出所有phase等于2或3的id,把它们存成一个集合(集合的查找效率比列表高很多)
- 遍历每一行的
list_ids列表,只保留那些在这个有效id集合里的元素
代码实现如下:
# 提取phase为2或3的id,转成集合 valid_ids = set(df[df['phase'].isin([2, 3])].index) # 对每个list_ids做过滤,生成新的列存储结果 df['filtered_list_ids'] = df['list_ids'].apply(lambda x: [id_item for id_item in x if id_item in valid_ids])
3. 查看最终结果
运行上面的代码后,你可以打印DataFrame看看效果:
print(df)
输出结果大概是这样的:
phase list_ids filtered_list_ids a1 1 [a1, a2, c3] [a2, c3] a2 3 [a1, b2, c3] [b2, c3] b1 3 [a2, b2] [a2, b2] b2 2 [b1, b2, c1] [b1, b2] b3 3 [b2, c1] [b2] c1 1 [a1, a2, c3] [a2, c3] c2 1 [a1, b1, c4] [b1] c3 2 [c1, c2, c4] [] c4 1 [c1, c2] []
简单解释下:比如valid_ids是{'a2','b1','b2','b3','c3'},所以每个list_ids里的元素只有在这个集合里才会被保留下来,像c3的list_ids里的元素都不在有效集合里,结果就是空列表啦。
内容的提问来源于stack exchange,提问作者guru
相关产品推荐
相关产品推荐

