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

У меня есть пандас, который разделен табуляцией.Я хотел бы получить строки, содержащие определенную строку в первой части третьего столбца.См. Этот пример:

col1       col2    col3    

a            a1    good | bad 

b            b1    bad | bad 

c            c1    foogood | foobad 

d            d1    bad | good  

e            e1    good | good  

f            f1    bad | foobad   

Здесь я хочу отделить третий столбец от символа |.Затем я хочу взять те, которые имеют строку good в первой части.Таким образом, желаемый результат будет

 col1           col2        col3    

    a            a1       good | bad 

    c            c1       foogood | foobad 

    e            e1        good | good  

Я знаю, что это можно сделать с помощью функции apply, но я не знаю, как определить такую ​​функцию с помощью apply.Я также пытался фильтровать, используя [], но не смог заставить его работать.Благодарим вас за помощь, братья и сестры.

Обновление : у меня также есть базовый файл TSV, и я знаю, что это можно сделать, используя grep и awk.Так что любое решение подойдет.

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Это очень просто с awk.

$ cat file
col1    col2    col3
a       a1      good | bad
b       b1      bad | bad
c       c1      foogood | foobad
d       d1      bad | good
e       e1      good | good
f       f1      bad | foobad
$
$ awk -F $'\t' '(NR == 1 || $3 ~ /^[^|]*good/)' file
col1    col2    col3
a       a1      good | bad
c       c1      foogood | foobad
e       e1      good | good

Кроме того, вы можете sed попробовать:

sed -n '1p; /^[^\t]*\t[^\t]*\t[^|]*good/p' file

, что также даст желаемый результат.

0 голосов
/ 22 октября 2018

Если требуемый текст начинается с good, а за ним всегда следует |, вы можете объединить их в одну подстроку (с этим порядком) непосредственно в .contains().Панды могут отфильтровать эти строки.

Входной DF

df
  col1 col2              col3
0    a   a1        good | bad
1    b   b1         bad | bad
2    c   c1  foogood | foobad
3    d   d1        bad | good
4    e   e1       good | good
5    f   f1      bad | foobad

Фильтрованный DF

df[df['col3'].str.contains('good | \n')]
  col1 col2              col3
0    a   a1        good | bad
2    c   c1  foogood | foobad
4    e   e1       good | good

Вы можете сделать то же самое с bad (вместо good)

df[df['col3'].str.contains('bad | \n')]
  col1 col2          col3
1    b   b1     bad | bad
3    d   d1    bad | good
5    f   f1  bad | foobad
0 голосов
/ 21 октября 2018

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

yourdf=df[df.col3.str.split('|').str[0].str.contains('good')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...