Извлекать, изменять и вставлять строки с пользовательской функцией - PullRequest
1 голос
/ 30 сентября 2019

У меня есть строки в фрейме данных 'Media6xy-08', 'Medka21xy-22', и я хочу извлечь строки и числа до или после определенных символов, а затем, наконец, вывести их в виде нового столбца. И на основе числовых значений после - строки, если цифры <11 выполняют какую-то условную работу. </p>

Итак, я попытался написать функцию для этого, но не смог выяснить, как весь процесс.

import re
import pandas as pd

df = pd.DataFrame({'A':['Media6xy-08',
                   'Medka21xy-22']})

df    

              A
0   Media6xy-08
1  Medka21xy-22

То, что хочется иметь, это

              A  modified_A
0   Media6xy-08  Med6x_8
1  Medka21xy-22  Med21y_22

Я пытался;

def modif(x):

   first_3_characters = x.str[0:3]

   digits_after_a_string = re.search(r"a(\d+)", x) # only want to get first two digits after sting 'a'

   digits_after_-_string = re.search(r"-(\d+)", x) # only want to get first two digits after string '-' exclude 0 if string is 08

   if digits_after_-_string < 11: # conditional 

      new_strings = first_3_characters + digits_after_a_string +'x'+ '_' + digits_after_-_string

   else:

     new_strings = first_3_characters + digits_after_a_string +'y'+ '_' + digits_after_-_string


   return new_strings


df['modified_A']=modif(df['A'])

Но при получении ошибок

SyntaxError: невозможно присвоить оператору

снова ожидаемый результат

              A  modified_A
0   Media6xy-08  Med6x_8
1  Medka21xy-22  Med21y_22

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Вот вариант.

part1 = list()
part2 = list()
parts = df.A.str.split('-')
for p in parts:
    part1.append(p[0])
    part2.append(p[1])

def rep(num, cutoff=11):
    repstr = 'x' if (num<cutoff) else 'y'
    return repstr

df['Part1'] = part1
df['Part2'] = part2
df['Target'] = ['Med' + str(e1).replace('xy',rep(e2, 11)) + '-' + str(int(e2)) for e1, e2 in zip([''.join(re.findall('(\d*xy)', x)) for x in part1], part2)]
df

Выход :

    A               Part1       Part2   Target
0   Media6xy-08     Media6xy    08      Med6x-8
1   Medka21xy-22    Medka21xy   22      Med21y-22
1 голос
/ 30 сентября 2019

Вы можете попробовать эту функцию с Python 3:

import re

digits=re.compile(r'(\d+)')

def modif(s):
   prefix = s[:3]
   numbers = [int(x) for x in digits.findall(s)]
   if numbers[1] < 11:
      return f'{prefix}{numbers[0]}x_{numbers[1]}'
   else:
      return f'{prefix}{numbers[0]}y_{numbers[1]}'

или более питонической версией:

import re

digits=re.compile(r'(\d+)')

def modif(s):
   prefix = s[:3]
   a,b = [int(x) for x in digits.findall(s)]
   return f'{prefix}{a}x_{b}' if b < 11 else f'{prefix}{a}y_{b}'

И вот подтверждение концепции:

Python 3.7.4 (default, Aug 12 2019, 14:45:07) 
[GCC 9.1.1 20190605 (Red Hat 9.1.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> 
>>> digits=re.compile(r'(\d+)')
>>> 
>>> def modif(s):
...    prefix = s[:3]
...    numbers = [int(x) for x in digits.findall(s)]
...    if numbers[1] < 11:
...       return f'{prefix}{numbers[0]}x_{numbers[1]}'
...    else:
...       return f'{prefix}{numbers[0]}y_{numbers[1]}'
... 
>>> modif('Media6xy-08')
'Med6x_8'
>>> modif('Medka21xy-22')
'Med21y_22'
>>> 

А вот как применить его к вашему фрейму данных, добавив новый столбец:

>>> df['Modified_A'] = [modif(x) for x in df['A']]
>>> df
              A  Modified_A
0   Media6xy-08     Med6x_8
1  Medka21xy-22   Med21y_22
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...