Замена значений столбца dataframe из цикла re.search - PullRequest
3 голосов
/ 01 апреля 2020

Как можно заменить значения существующего столбца данных на значения из повторного поиска l oop?

Это мой повторный поиск l oop.

for i in dataset['col1']:
    clean = re.search('(nan|[0-9]{1,4})([,.][0-9]{1,4})?', i)
    print(clean.group())    

Это примерный набор данных (набор данных)

    year    col1
1    2001    10.563\D
2    2002    9.540\A
3    2003    4.674\G
4    2004    3.2754\u
5    2005    nan\x

Ответы [ 4 ]

3 голосов
/ 01 апреля 2020

Вы можете использовать Series.apply , чтобы применить пользовательскую функцию к dataset["col1"]. Или лучше использовать Series.str.replace для замены шаблона строкой замены.

Попробуйте:

def func(i):
    clean = re.search('(nan|[0-9]{1,4})([,.][0-9]{1,4})?', i)
    return clean.group()

dataset["col1"] = dataset["col1"].apply(func)

ИЛИ лучше,

df["col1"] = df["col1"].str.replace(r'(.*?)(\\.*?$)', r"\1")

Вывод :

>>> print(dataset)

   year    col1
0  2001  10.563
1  2002   9.540
2  2003   4.674
3  2004  3.2754
4  2005     nan
2 голосов
/ 01 апреля 2020

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

dataset['col1'] = dataset['col1'].str.split('\\').str[0]

или split в float тип данных:

dataset['col1'] = dataset['col1'].str.split('\\').str[0].astype(float)

Это преобразует эти значения на месте и не подвержено ошибкам. Он просто всегда берет первый элемент из результирующего массива в случае, если существует обратная коса sh.

Результат:

   year    col1
0  2001  10.563
1  2002   9.540
2  2003   4.674
3  2004  3.2754
4  2005     nan
2 голосов
/ 01 апреля 2020

Вы можете использовать pandas str extract , с предварительным утверждением - в нем будут храниться только элементы до '\'

  df['cleaned'] = df["col1"].str.extract(r'(.*(?=\\))')

     year   col1        cleaned
1   2001    10.563\D    10.563
2   2002    9.540\A     9.540
3   2003    4.674\G     4.674
4   2004    3.2754\u    3.2754
5   2005    nan\x       nan
2 голосов
/ 01 апреля 2020

Используя ваш метод:

dataset["col1"] = dataset["col1"].apply(lambda x: re.search('(nan|[0-9]{1,4})([,.][0-9]{1,4})?', x).group())

хотя лично я бы сделал это вместо:

dataset["col1"] = dataset["col1"].str[:-2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...