使用外部列表过滤具有列表作为列值的数据框并删除外部人员

时间:2018-11-15 12:18:44

标签: python pandas dataframe

我有一个这样的数据框

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(),但没有成功...

你能帮我吗?预先感谢!

3 个答案:

答案 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