2016-05-11 3 views
0

У меня есть панд dataframe, который выглядитПанды мультииндексных из регулярных выражений в колонке

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 

Первый столбец «Name» должно быть разделено на имя и фамилию, и поставить в мультииндексных.

   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 

ответ

2

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

df[['name','surname']] = df.Name.str.extract(r'([A-Z][a-z]*)([A-Z][a-z]*)', 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 
+0

Это лучший ответ – piRSquared

+0

@piRSquared - Спасибо. – jezrael

0

Решение

import pandas as pd 

pattern = r'.*\b([A-Z][a-z]*)([A-Z][a-z]*)\b.*' 
names = df.Name.str.extract(pattern, expand=True) 
midx = pd.MultiIndex.from_tuples(names.values.tolist()) 
df.index = midx 
df[['Value']] 

Объяснение

pattern захватывает группу букв, начинающееся с заглавной A-Z с последующим любым количеством строчных a-z следует еще один капитал A-Z и любое количество нижний футляр a-z. Затем он разбивает его на две части.

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

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

Смежные вопросы