专栏中的正则表达式的Pandas MultiIndex

时间:2016-05-11 06:34:17

标签: python regex pandas multi-index

我有一个看起来像

的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

第一列'Name'需要拆分为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

2 个答案:

答案 0 :(得分:2)

我认为您可以使用extract来提取Namessurname,然后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

答案 1 :(得分: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 -情况1}}。然后它将它分成两部分。

pd.MultiIndex.from_tuples创建MultiIndex

names.values.tolist()将转换后的DataFrame转换为将被解释为元组的列表列表。