Строка заменить для колонны панд - PullRequest
2 голосов
/ 07 мая 2019

У меня есть фрейм данных, такой как:

col1

OK.1:177788-1000(+):Genus_species
OK.1:177788-2000(+):Genus_species
OK.1:177788-3000(+):Genus_species
OK.1:177788-3000(+):Genus_species

И я бы хотел получить:

OK.1_177788-1000_+__Genus_species
OK.1_177788-2000_+__Genus_species
OK.1_177788-3000_+__Genus_species
OK.1_177788-3000_+__Genus_species

instread, но я не знаю, как сделать это в одной строке с re.sub, например, я пытался:

df['col1'].replace(to_replace="\(", value=r"_", regex=True)
df['col1'].replace(to_replace="\)", value=r"_", regex=True)
df['col1'].replace(to_replace="\:", value=r"_", regex=True)

Но я ищу что-то более умное в одной строке.

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Предполагая, что ваш фрейм данных - это все строки, str.replace должен выполнить трюк без необходимости в регулярных выражениях.

df = df.col1.str.replace('(+):', '_+__', regex=False)

Вы устанавливаете regex = False здесь, чтобы указать, что вы ищете эти строки как литерал, а не как его регулярное выражение.

Пример

import pandas as pd
import numpy as np

df = pd.DataFrame({'col1': ['OK.1:177788-1000(+):Genus_species', 'OK.1:177788-2000(+):Genus_species']})

Выход:

                             col1
0  OK.1:177788-1000(+):Genus_species
1  OK.1:177788-2000(+):Genus_species

Тогда используйте

df = df.col1.str.replace('(+):', '_+__', regex=False)

Выход:

                         col1
0    OK.1:177788-1000_+__Genus_species
1    OK.1:177788-2000_+__Genus_species
0 голосов
/ 08 мая 2019

Это должно соответствовать вашим требованиям:

import numpy as np
import pandas as pd

df = pd.DataFrame({'a': ['OK.1:177788-2000(+):Genus_species',
                         'OK.1:177788-3000(+):Genus_species',
                         'OK.1:177788-3000(+):Genus_species']})
df['b'] = df.a.str.replace(':|\(|\)', '_', regex=True)
print(df)

Дает:

                                   a                                  b
0  OK.1:177788-2000(+):Genus_species  OK.1_177788-2000_+__Genus_species
1  OK.1:177788-3000(+):Genus_species  OK.1_177788-3000_+__Genus_species
2  OK.1:177788-3000(+):Genus_species  OK.1_177788-3000_+__Genus_species
...