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

Я пытаюсь сделать следующее:

options = ['abc', 'def']
df[any(df['a'].str.startswith(start) for start in options)]

Я хочу применить фильтр, чтобы у меня были только записи со значениями в столбце «а», начиная с одной из указанных опций.

следующий код работает, но мне нужно, чтобы он работал с несколькими вариантами префиксов ...

start = 'abc'
df[df['a'].str.startswith(start)]

Сообщение об ошибке

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Чтение Значение Истины Серии неоднозначно. Используйте a.empty, a.bool (), a.item (), a.any () или a.all () , но не знаете, как это сделать.

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Вы можете передать набор параметров для стартов с

df = pd.DataFrame({'a': ['abcd', 'def5', 'xabc', '5abc1', '9def', 'defabcb']})
options = ['abc', 'def']
df[df.a.str.startswith(tuple(options))]

Вы получаете

    a
0   abcd
1   def5
5   defabcb
0 голосов
/ 11 сентября 2018

Еще одно решение:

# extract all possible values for 'a' column
all_a_values = df['a'].unique()
# filter 'a' column values by my criteria
accepted_a_values = [x for x in all_a_values if any([str(x).startswith(prefix) for prefix in options])]
# apply filter
df = df[df['a'].isin(accepted_a_values))]

Взял отсюда: удалить строки и массивы ValueError были разной длины

Решение, предоставленное @Vaishali, является наиболее простым и логичным, но мне также понадобился список accept_a_values ​​, чтобы выполнить итерации. Это не было упомянуто в вопросе, поэтому я отмечаю ее ответ как правильный.

0 голосов
/ 29 августа 2018

Вы можете попробовать это:

mask = np.array([df['a'].str.startswith(start) for start in options]).any(axis=1)

создает Series для каждой опции start и применяет any вдоль соответствующих строк.

Вы получили сообщение об ошибке, потому что встроенный ожидает список bool s, но, как показано в сообщении об ошибке, «Истинное значение многозначного объекта неоднозначно», поэтому вам лучше использовать массив с учетом any.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...