Фильтрация столбца списков строк в фрейме данных Pandas

#pandas #dataframe #filter

#pandas #фрейм данных #Фильтр

Вопрос:

 df=pd.DataFrame({'sym':['A', 'B', 'C', 'D'],'event':[['1','2', '3'], ['1'], ['2', '3'],['2']]} )
 

df

     sym event
0   A   [1, 2, 3]
1   B   [1]
2   C   [2, 3]
3   D   [2]
 

Столбец событий состоит из списков строк. Я пытаюсь отфильтровать столбец событий для любых строк, содержащих ‘3’, поэтому я ищу индексы 0 и 2.

Я знаю, как использовать

 ["3" in df.event[0]]
 

для каждой строки, и я думаю, что лямбда-функция подтолкнет меня к финишу.

Комментарии:

1. df[df.event.astype(str).str.contains('3')] ? Или каков ваш желаемый результат?

2. Вот и все. Отлично. спасибо

Ответ №1:

Пожалуйста, попробуйте:

 print(df[df.event.astype(str).str.contains(r'b3b')])



sym      event
0   A  [1, 2, 3]
2   C     [2, 3]
 

Комментарии:

1. это также приведет к фильтрации ’33’ ~

2. Спасибо, отредактировано, чтобы убедиться, что выбрано только 3

Ответ №2:

Ряд.разнесите, чтобы разделить значения, подобные списку, на строки

используется explode для преобразования списка в строку:

 '3' in df['event'].explode().values
 

чтобы найти, какая строка содержит ‘3’, используйте index:

 idx = df['event'].explode() == '3'
df.loc[idx[idx].index]
 

Комментарии:

1. Спасибо. итак, как мне отфильтровать строки строк df, где df [‘event’] содержит «3»?

2. вы можете использовать индекс строки. как explode сохранить исходный индекс строки.

3. вы также можете сделать: df['event'].explode().eq('3').any(level=0) с помощью explode . Добавление альтернативы 🙂

Ответ №3:

Давайте попробуем

 out = df[pd.DataFrame(df.event.tolist()).isin(['3']).any(1).values]
Out[78]: 
  sym      event
0   A  [1, 2, 3]
2   C     [2, 3]