Панды создают новый столбец из строкового фрагмента другого столбца

#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)
 

Из документации pandas:

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)), что избавило бы вас от дополнительного столбца.