Итак, я пытаюсь сделать простой фильтр, который будет принимать фрейм данных и отфильтровывать все строки, которые не имеют целевого жанра. С кодом будет проще объяснить:
import pandas as pd
test = [{
"genre":["RPG","Shooter"]},
{"genre":["RPG"]},
{"genre":["Shooter"]}]
data =pd.DataFrame(test)
fil = data.genre.isin(['RPG'])
Я хочу, чтобы фильтр возвращал фрейм данных со следующими элементами:
[{"genre":["RPG"]},
{"genre":["RPG", "Shooter"]}]
Это ошибка, которую я получаю, когда пытаюсь использовать свой код:
SystemError: <built-in method view of numpy.ndarray object at 0x00000180D1DF2760> returned a result with an error set
Проблема в том, что элементами жанра являются списки, поэтому isin не работает. Использовать:
mask = data['genre'].apply(frozenset(['RPG']).issubset)
print(data[mask])
Выход
genre
0 [RPG, Shooter]
1 [RPG]
Выражение:
frozenset(['RPG']).issubset
Проверяет, что в каждой строке содержится какой-либо список из документации:
Проверьте, находится ли каждый элемент в наборе в другом.
Таким образом, вы также можете легко проверить несколько значений, например:
mask = data['genre'].apply(frozenset(['RPG', "Shooter"]).issubset)
print(data[mask])
Выход
genre
0 [RPG, Shooter]
Вы хотите:
data[data.genre.apply(lambda x: 'RPG' in x)]
Или:
data[data.genre.explode().eq('RPG').any(level=0)]
Выход:
genre
0 [RPG, Shooter]
1 [RPG]
@Vaishali Верно, что вопросы дублируются, но я считаю, что ответы здесь лучше, чем те, что приведены в другом.