Панды: удалите ячейки, если последние шесть символов содержат любое целое число ниже порога

Пожалуйста, простите меня за название; Мне было трудно резюмировать сложный вопрос.

У меня есть фрейм данных pandas значений, который выглядит так:

    col1         col2            col3          col4       
10_Q999999   111_Q4987666    110_Q277778   111_Q999999

Скажем, порог равен 7. Мне нужно взять этот фрейм данных и удалить каждую ячейку, в которой любая из цифр после _Q падает ниже порогового значения 7. Для ячеек, где каждая цифра> = 7, я хочу сохранить только часть строки перед "_Q".

Желаемый результат будет выглядеть так:

  col1            col2            col3          col4       
   10                                           111

Я пытаюсь найти способ разбить каждый столбец на «_Q», преобразовать последний фрагмент в список целых чисел, взять минимум, а затем сравнить минимум с порогом, наконец, удалив список целых чисел, но я ' m застрял посреди отвратительно вложенного списка:

[[[int(z) for z in y[-3:] if (z != '') and "Q" not in z ] for y in chunk[x].astype(str).str.split("_") if y != ''] for x in chunk[cols] if x != '']

Решение:

s=~chunk.apply(lambda x : 
x.str.split('_Q').str[1].str.contains('[0:6]', na=False))
        chunk = chunk.apply(lambda x : x.str.split('_Q').str[0])[s].fillna('')
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
35
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать split с contains

s=~df.apply(lambda x : x.str.split('_Q').str[1].str.contains('1|2|3|4|5|6'))
df.apply(lambda x : x.str.split('_Q').str[0])[s].fillna('')
Out[549]: 
  col1 col2 col3 col4
0   10            111

@SummerEla извините за недоразумение, проверьте обновление

BENY 02.05.2018 02:53

Ты только что спас мне день. Огромное спасибо!

SummerEla 02.05.2018 03:05

Мне действительно нужно было добавить аргумент для обработки na: na = False. Эта дама очень признательна за вашу помощь :)

SummerEla 02.05.2018 03:06

Вы можете заменить 1|2|3|... на [0-6].

cs95 02.05.2018 05:24

Делаем переход с 1 | 2 | 3 | и т.д. до [0-x], предложенные @COLDSPEED, действительно увеличили скорость. Поскольку порог - это значение, вводимое пользователем, мне пришлось бы делать '| ".join для создания строки каждый раз, а вместо этого здесь просто используется форматирование строки для ввода порога. Большое спасибо!

SummerEla 02.05.2018 19:58

Мне не нравится apply, поэтому я предлагаю альтернативу, включающую stack, str.split и np.where, для (надеюсь) лучшей производительности.

v = df.stack()
sp = v.str.split('_Q')
i, j = sp.str[0], sp.str[1]

v[:] = np.where(j.str.contains('[0-6]'), '', i)
v.unstack()

  col1 col2 col3 col4
0   10            111

Спасибо за предложение. К сожалению, я показываю, что это немного медленнее, чем метод Вэня. применить: real 0m1.289s user 0m1.417s sys 0m3.403s stack: real 0m1.401s user 0m1.550s sys 0m3.524s

SummerEla 02.05.2018 19:53

@SummerEla Хорошо, спасибо. Я думаю, проблема в стеке, он почти такой же медленный, как и apply. Надеюсь, они это исправят; есть большие возможности для улучшения ;-)

cs95 02.05.2018 20:20

Другие вопросы по теме