Python 要索引的ID的交叉引用列表
我将与某个值关联的ID列表组合在一起,并将所有这些ID列表放入一个数据框中。它看起来是这样的:(index=id) 我希望遍历这些列表,并将它们交叉引用到id索引,其中phase等于2或3,然后将匹配的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
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 []