我有一个这样的数据框
Sample_ID Main_Sample_ID
1ABC [2052, 2402]
2CBA [228]
以及带有允许值的外部列表:
allowed = [2402]
我想要做的是过滤那些允许值的行,并删除那些不允许的行,删除也不允许的内部列表值。
最后,我想得到结果:
Sample_ID Main_Sample_ID
1ABC [2402]
我尝试过:
sample_type_ids_list = self._full_structure['Main_Sample_ID'].tolist()
for sample_type_ids in sample_type_ids_list:
for sample_type_id in sample_type_ids:
info_by_type_df['flag'] = info_by_type_df.apply(lambda x: int(sample_type_id in allowed), axis=1)
我也尝试了.loc
和.isin()
,但没有成功...
你能帮我吗?预先感谢!
答案 0 :(得分:0)
您可以按以下方式将项目保留在allowed
列表中,然后删除空白列表。
# change list in every row to empty if id are not present in `allowed`
# if in allowed list, then keep it
df = df.apply(lambda row: [id for id in row['Main_Sample_ID'] if id in allowed], axis=1)
# drop rows with empty lists
df = df[df.apply(len) > 0]
答案 1 :(得分:0)
您可以分配列表理解。这只是表面上的Pandas问题,因为您当前的数据结构仅允许Python级循环:
df = pd.DataFrame({'Sample_ID': ['1ABC', '2CBA'],
'Main_Sample_ID': [[20152, 2402], [228]]})
df['Main_Sample_ID'] = [[i for i in lst if i == 2402] for lst in \
df['Main_Sample_ID'].values.tolist()]
df = df[df['Main_Sample_ID'].str.len() > 0]
print(df)
Main_Sample_ID Sample_ID
0 [2402] 1ABC
答案 2 :(得分:0)
对numpy数组使用自定义函数:
Sub Generate()
Dim sig As Signature
Application.DisplayAlerts = False
Set sig = ActiveWorkbook.Signatures.AddSignatureLine("{00000000-0000-0000-0000-000000000000}")
sig.Setup.SuggestedSigner = "XXXXXXXX"
sig.Setup.SuggestedSignerLine2 = "YYYYYYYYYY"
sig.Setup.SuggestedSignerEmail = "mail@mail.mail"
sig.Sign 'PARAMETERS SHOULD BE HERE
ActiveWorkbook.Signatures.Commit
AddSignature = True
End Sub