Python 要索引的ID的交叉引用列表

Python 要索引的ID的交叉引用列表,python,list,pandas,dataframe,Python,List,Pandas,Dataframe,我将与某个值关联的ID列表组合在一起,并将所有这些ID列表放入一个数据框中。它看起来是这样的:(index=id) 我希望遍历这些列表,并将它们交叉引用到id索引,其中phase等于2或3,然后将匹配的id保留在原始列表中(如果不可能,请使用修改过的列表创建一个新列)。如下所示: phase list_ids id a1 1 [a2,c3] #ids whose phase != 2|3 not kept in list a2 3 [b2,c3] b1

我将与某个值关联的ID列表组合在一起,并将所有这些ID列表放入一个数据框中。它看起来是这样的:(index=id)

我希望遍历这些列表,并将它们交叉引用到id索引,其中phase等于2或3,然后将匹配的id保留在原始列表中(如果不可能,请使用修改过的列表创建一个新列)。如下所示:

    phase  list_ids
id  
a1  1      [a2,c3] #ids whose phase != 2|3 not kept in list
a2  3      [b2,c3]  
b1  3      [a2,b2] 
b2  2      [b1,b2] 
b3  3      [b2] 
c1  1      [a2,c3] 
c2  1      [b1] 
c3  2      [] 
c4  1      []
如果可能的话,我希望在dataframe对象中这样做,因为每行都有多个特性/依赖项。有没有关于如何做的建议

我的实际数据:

               phase  ids
Study_id             
ACP-103-006    2.0   [ACP-103-006, ACP-103-020, ACP-103-019, ACP-10... 
ACP-103-008    2.0   [ACP-103-006, ACP-103-020, ACP-103-019, ACP-10...  
ACP-103-010    2.0   [ACP-103-042, ACP-103-034, ACP-103-014, ACP-10...  
ACP-103-012    3.0   [ACP-103-042, ACP-103-034, ACP-103-014, ACP-10...  
ACP-103-014    3.0   [ACP-103-042, ACP-103-034, ACP-103-014, ACP-10...   
以及数据类型:

phase float64 
ids object
dtype: object 
以及良好的_id输出:

print(good_ids)
{'CLS1001-301', 'EFC13799', 'AG120-C-009', 'IRBES_R_04320', 'LTS11298', 'CLS1003-302', '13621', 'TMC-ORI-10-01', '11935', 'C_8428', 'ACP-103-008', 'SFY13476', 'MNTX 301EXT', '14-OBE001-016', '812P310', 'V01-126A-201', 'VX06-770-101', 'EFC11603', ...}

假设列
list\u id
中的每个元素都是字符串列表,可以执行以下操作:

首先获取“良好”ID的
集合
(其中阶段为2或3):

接下来使用
apply
过滤
列表ID
,使用
良好ID

df["list_ids"] = df["list_ids"].apply(lambda x: [val for val in x if val in good_ids])
print(df)
#    phase  list_ids
#id                 
#a1      1  [a2, c3]
#a2      3  [b2, c3]
#b1      3  [a2, b2]
#b2      2  [b1, b2]
#b3      3      [b2]
#c1      1  [a2, c3]
#c2      1      [b1]
#c3      2        []
#c4      1        []

忘记提及“阶段”列的类型为“浮动”。我得到一个错误“'float'对象不可编辑”。这似乎是另一个错误。你能把你犯错误的地方贴出来吗?我的猜测是,您可能缺少
isin([…])
中的方括号,可能错误在于
“ids”
列中的某个地方有一个
浮点值(而不是列表)。试着做
sub.head(5)[“id”]。应用(lambda x:[val for val in x if val in good_id])
看看前5行是否有效。是的,似乎有效。我记得有些id没有任何非数字字符。只需要弄清楚如何递归地更改所有列表元素的所有类型就可以了。如果不是列表,您可以尝试将所有“ID”转换为列表:
subs[“ID”]。apply(lambda x:x ifisinstance(x,list)else[x])
good_ids = set(df[df["phase"].isin([2,3])].index)
print(good_ids)
#{'a2', 'b1', 'b2', 'b3', 'c3'}
df["list_ids"] = df["list_ids"].apply(lambda x: [val for val in x if val in good_ids])
print(df)
#    phase  list_ids
#id                 
#a1      1  [a2, c3]
#a2      3  [b2, c3]
#b1      3  [a2, b2]
#b2      2  [b1, b2]
#b3      3      [b2]
#c1      1  [a2, c3]
#c2      1      [b1]
#c3      2        []
#c4      1        []