#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. Ах да, лямбда-функция — мой заклятый враг, если бы я знал тебя лучше, я бы спал лучше 🙂