Фильтрация информационного кадра со списком в виде значений столбца с внешним списком и удаление посторонних - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть такой фрейм данных

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 голосов
/ 15 ноября 2018

Вы можете назначить понимание списка. Это только поверхностно вопрос Панды, потому что ваша текущая структура данных допускает только петли уровня 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
0 голосов
/ 15 ноября 2018

Использование пользовательских функций с массивами 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]
0 голосов
/ 15 ноября 2018

Вы можете сохранить элементы в списке 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...