«Добавить» номер в строку внутри серии pandas

#python #pandas

#python #pandas

Вопрос:

Предположим, у меня есть следующая серия (тип — string)

 0      F0/Images/1/15.tiff
1      F0/Images/1/15.tiff
2      F0/Images/1/15.tiff
3      F0/Images/1/15.tiff
4      F0/Images/1/15.tiff
 

Я хочу «добавить» 1 к числу непосредственно перед ‘.tiff’. Итак, я должен получить результат:

 0      F0/Images/1/16.tiff
1      F0/Images/1/16.tiff
2      F0/Images/1/16.tiff
3      F0/Images/1/16.tiff
4      F0/Images/1/16.tiff
 

Как я могу это сделать в pandas?

Комментарии:

1. Можете ли вы предоставить нам фрагмент кода, над которым вы работаете?

Ответ №1:

Вы можете добиться этого с regex помощью .

Мы можем определить функцию для их выполнения, а затем применить ее к нашему столбцу.

 df
   idx             filename
0    0  F0/Images/1/15.tiff
1    1  F0/Images/1/15.tiff
2    2  F0/Images/1/15.tiff
3    3  F0/Images/1/15.tiff
4    4  F0/Images/1/15.tiff


def add_one(filename):
    number = int(re.search(r'(?<=/)[0-9]{2}(?=.tiff)', filename).group())   1
    return re.sub(r'(?<=/)[0-9]{2}(?=.tiff)', str(number), filename)

df['filename'] = df['filename'].apply(add_one)

df
   idx             filename
0    0  F0/Images/1/16.tiff
1    1  F0/Images/1/16.tiff
2    2  F0/Images/1/16.tiff
3    3  F0/Images/1/16.tiff
4    4  F0/Images/1/16.tiff
 

Ответ №2:

С именем столбца 0 вы можете использовать str.extract для выполнения некоторых векторизованных регулярных выражений pandas. Это относится к именам файлов с любым расширением файла (т.Е. Не Только .tiff к файлам):

  df = pd.DataFrame({0: {0: 'F0/Images/1/15.tiff',
  1: 'F0/Images/1/15.tiff',
  2: 'F0/Images/1/15.tiff',
  3: 'F0/Images/1/15.tiff',
  4: 'F0/Images/1/15.tiff'}})
s = (df[0].str.extract('(d )..*


Ответ №3:

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

 yourserie.str.replace('(.*)([0-9] )(.[A-Za-z]*)',lambda x:x.group(1) str(int(x.group(2)) 1) x.group(3))
 

Полный пример, включая генерацию входных данных:

 yourserie = pd.Series(['F0/Images/1/15.tiff','F0/Images/1/15.tiff','F0/Images/1/15.tiff'])
yourserie.str.replace('(.*)([0-9] )(.[A-Za-z]*)',lambda x:x.group(1) str(int(x.group(2)) 1) x.group(3))
 

Комментарии:

1. Не могли бы вы привести пример такой работы? Когда я выполняю это для столбца, он возвращает то же значение, без увеличения числа.

2. я добавил свой реплицированный ввод из вашего, он работает для меня

).astype(int) 1).astype(str)
df[0] = df[0].str.extract('(.*/)d .*

Ответ №3:

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


Полный пример, включая генерацию входных данных:


Комментарии:

1. Не могли бы вы привести пример такой работы? Когда я выполняю это для столбца, он возвращает то же значение, без увеличения числа.

2. я добавил свой реплицированный ввод из вашего, он работает для меня

) s df[0].str.extract('(..*$)')
df
0
0 F0/Images/1/16.tiff
1 F0/Images/1/16.tiff
2 F0/Images/1/16.tiff
3 F0/Images/1/16.tiff
4 F0/Images/1/16.tiff

Ответ №3:

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


Полный пример, включая генерацию входных данных:


Комментарии:

1. Не могли бы вы привести пример такой работы? Когда я выполняю это для столбца, он возвращает то же значение, без увеличения числа.

2. я добавил свой реплицированный ввод из вашего, он работает для меня