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

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

У меня есть pandas dataframe значений, который выглядит следующим образом:

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

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

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

  col1            col2            col3          col4       
   10                                           111

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

[[[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('')

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Мне не нравится 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
0 голосов
/ 02 мая 2018

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...