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

Python 将列名分配给Series.str.extract()的输出,python,pandas,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(colu

我正在使用

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)'
regex=r'(?Psometext\w)(?Paa | bb)(?P\d+-\d)'
我是否遗漏了什么,有没有更简单的方法?
谢谢

将名称嵌入正则表达式是一种正确的方法。它规定在未来的时间内这样做

如果已经有一些列的名称为
0
1
2
,则使用
.rename()
的第一个解决方案将不可靠

在我看来,regex解决方案是最好的,但您可以开始使用类似
.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)
def extract\u colnames(df、column、sep、cnames、drop\u col=True):
如果是下拉菜单:
drop_col=[列]
其他:
drop_col=[]
正则表达式='(?P.*)+sep+'(?P.*)'
返回df.join(df.loc[:,column].str.extract(regex,expand=True)).drop(drop\u col,axis=1)
cnames=['col1','col2','col3']
data=data.pipe(extract_colnames,column='colname',
sep='',cnames=cnames,drop\U col=True)
谢谢,这是一个很方便的功能,我可能最终会使用它!