使用外部列表筛选列表为列值的数据帧并删除外部对象

2024-04-29 16:32:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的数据帧

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(),但没有成功。。。你知道吗

你能帮我吗?提前谢谢!你知道吗


Tags: sampleininfoididsdf列表for
3条回答

您可以按如下方式保留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]

您可以指定一个列表。这只是一个表面的问题,因为您当前的数据结构只允许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

对numpy数组使用自定义函数:

def func(values):
    l = np.array(values)[np.isin(values,allowed)]
    if l.size>0:
        return l
        #if list require return l.tolist()
    else:
        return np.nan

df.Main_Sample_ID = df.Main_Sample_ID.apply(func)
df = df.dropna()

print(df)
  Sample_ID Main_Sample_ID
0      1ABC         [2402]

相关问题 更多 >