将列名称分配给Series.str.extract()的输出

时间:2017-02-14 16:04:51

标签: python pandas

我正在使用

df[colname].str.extract(regex) 

将一列字符串解析为多列。我希望能够同时分配列名,例如:

df[colname].str.extract(regex, columns=cnames) 

其中:

cnames = ['col1','col2','col3']
regex = r'(sometext\w)_(aa|bb)_(\d+-\d)'

它可能有一个笨重的结构,如:

df[colname].str.extract(regex).rename(columns = dict(zip(range(len(cnames)),cnames)))

否则我可以将列名作为命名组嵌入正则表达式中,因此正则表达式更改为:

regex = r'(?P<col1>sometext\w)_(?P<col2>aa|bb)_(?P<col3>\d+-\d)'

我在这里遗漏了什么,有更简单的方法吗? 感谢

1 个答案:

答案 0 :(得分:0)

将名称嵌入到正则表达式中所做的是正确的方法。它声明在documentation中执行此操作。

如果您的某些列已经包含名称.rename()01,则使用2的第一个解决方案将不会很强大。

IMO正则表达式解决方案是最好的,但您可以开始使用类似.pipe()之类的东西来实现这种方式的功能。但是,正如您将看到的,当您不想要相同的正则表达式时,它开始变得混乱。

def extract_colnames(df, column, sep, cnames, drop_col=True):
    if drop_col:
        drop_col = [column]
    else:
        drop_col = []
    regex = '(?P<' + ('>.*)' + sep + '(?P<').join(cnames) + '>.*)'
    return df.join(df.loc[:, column].str.extract(regex, expand=True)).drop(drop_col, axis=1)

cnames = ['col1','col2','col3']
data = data.pipe(extract_colnames, column='colname',
                 sep='_', cnames=cnames, drop_col=True)