#pandas
#python #pandas
Вопрос:
Я хочу создать новый столбец в Pandas, используя строку, нарезанную для другого столбца в dataframe.
Например.
Sample Value New_sample
AAB 23 A
BAB 25 B
Где New_sample
находится новый столбец, сформированный из простого [:1]
фрагмента Sample
Я пробовал несколько вещей, но безрезультатно — я чувствую, что мне не хватает чего-то простого.
Какой наиболее эффективный способ сделать это?
Ответ №1:
Вы можете вызвать str
метод и применить фрагмент, это будет намного быстрее, чем другой метод, поскольку он векторизован (спасибо @unutbu):
df['New_Sample'] = df.Sample.str[:1]
Вы также можете вызвать лямбда-функцию в df, но это будет медленнее для больших фреймов данных:
In [187]:
df['New_Sample'] = df.Sample.apply(lambda x: x[:1])
df
Out[187]:
Sample Value New_Sample
0 AAB 23 A
1 BAB 25 B
Ответ №2:
Вы также можете использовать slice()
для нарезки строки Series
следующим образом:
df['New_sample'] = df['Sample'].str.slice(0,1)
Series.str.slice(start = None, stop = None, step = None)
Вырезайте подстроки из каждого элемента в ряду / индексе
Для нарезки индекса (если индекс имеет тип string), вы можете попробовать:
df.index = df.index.str.slice(0,1)
Комментарии:
1. есть ли какие-либо предпочтения между
df.somecolumn.str[0:1]
иdf.somecolumn.str.slice(0,1)
?
Ответ №3:
Добавление решения к общему варианту, когда ширина фрагмента варьируется в строках фрейма данных:
#--Here i am extracting the ID part from the Email (i.e. the part before @)
#--First finding the position of @ in Email
d['pos'] = d['Email'].str.find('@')
#--Using position to slice Email using a lambda function
d['new_var'] = d.apply(lambda x: x['Email'][0:x['pos']],axis=1)
#--Imagine x['Email'] as a string on which, slicing is applied
Надеюсь, это поможет!
Комментарии:
1. Спасибо, что добавили это распространенное вариативное решение, именно то, что я искал! И объединить в одну строку:
d['new_var'] = d.apply(lambda x: x['Email'][0:x['Email'].find('@')],axis=1)
2. Вы также можете сделать d[«new_var»] = np.vectorize(лямбда x : x.split(«@»)[0])( np.array(d[«Email»],dtype=str)), что избавило бы вас от дополнительного столбца.