Pandas MultiIndex из регулярного выражения на столбце

У меня есть рамка данных pandas, которая выглядит

df = pd.DataFrame( [ ['JoeSmith', 5], ['CathySmith', 3], ['BrianSmith', 12], ['MarySmith', 67], ['JoeJones', 23], ['CathyJones', 98], ['BrianJones', 438], ['MaryJones', 75], ['JoeCollins', 56], ['CathyCollins', 125], ['BrianCollins', 900], ['MaryCollins', 321], ], columns = ['Name', 'Value'] ) print df Name Value 0 JoeSmith 5 1 CathySmith 3 2 BrianSmith 12 3 MarySmith 67 4 JoeJones 23 5 CathyJones 98 6 BrianJones 438 7 MaryJones 75 8 JoeCollins 56 9 CathyCollins 125 10 BrianCollins 900 11 MaryCollins 321 

Первый столбец «Имя» должен быть разделен на имена First и Last и помещен в MultiIndex.

  Value Joe Smith 5 Cathy Smith 3 Brian Smith 12 Mary Smith 67 Joe Jones 23 Cathy Jones 98 Brian Jones 438 Mary Jones 75 Joe Collins 56 Cathy Collins 125 Brian Collins 900 Mary Collins 321 

Я думаю, вы можете использовать extract для извлечения Names и surname , а затем set_index и последний столбец с set_index Name :

 df[['name','surname']] = df.Name.str.extract(r'([AZ][az]*)([AZ][az]*)', expand=True) df = df.set_index(['name','surname']).drop('Name', axis=1) print df Value name surname Joe Smith 5 Cathy Smith 3 Brian Smith 12 Mary Smith 67 Joe Jones 23 Cathy Jones 98 Brian Jones 438 Mary Jones 75 Joe Collins 56 Cathy Collins 125 Brian Collins 900 Mary Collins 321 

Решение

 import pandas as pd pattern = r'.*\b([AZ][az]*)([AZ][az]*)\b.*' names = df.Name.str.extract(pattern, expand=True) midx = pd.MultiIndex.from_tuples(names.values.tolist()) df.index = midx df[['Value']] 

объяснение

pattern захватывает группу букв, начинающуюся с капитала AZ за которой следует любое число нижних регистров az за которым следует еще один капитал AZ и любое количество нижних регистров az . Затем он разбивает его на две части.

pd.MultiIndex.from_tuples создает MultiIndex .

names.values.tolist() превращает преобразованный DataFrame в список списков, которые будут интерпретироваться как кортежи.