#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]