Использование целых чисел из столбцов в качестве индексаторов фрагментов строки в другом столбце

#string #pandas #dataframe #python-3.6 #slice

#строка #pandas #фрейм данных #python-3.6 #фрагмент

Вопрос:

У меня есть df:

 string_pos = {'string': [ 'aabb', 'ddcc', ],
              'position_1': [0, 1],
              'position_2': [3, 4]}
  

вывод:

     string  position_1  position_2
0    aabb        0          3
1    ddcc        1          4
  

Затем я пишу то, что, по моему мнению, добавит новый столбец с подстрокой столбца ‘string’:

 df['short_string'] = df.string.str[df['position_1'], df['position_2']]
  

Но это возвращает:

     string  position_1  position_2  short_string
  0  aabb       0           3           NaN
  1  ddcc       1           4           NaN
  

Я пытаюсь получить:

     string  position_1  position_2  short_string
  0  aabb       0           3           aab
  1  ddcc       1           4        dcc
  

Ответ №1:

Я думаю, вам нужно обрабатывать каждую строку с помощью DataFrame.apply with lambda function :

 df['short_string'] = df.apply(lambda x: x['string'][x['position_1']:x['position_2']], axis=1)
  

Или используйте понимание списка с zip :

 zipped = zip(df['string'], df['position_1'], df['position_2'])
df['short_string'] = [a[b:c] for a,b,c in zipped]
print (df)
  string  position_1  position_2 short_string
0   aabb           0           3          aab
1   ddcc           1           4          dcc
  

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

1. Ах да, лямбда-функция — мой заклятый враг, если бы я знал тебя лучше, я бы спал лучше 🙂