我正在使用
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)'
我在这里遗漏了什么,有更简单的方法吗? 感谢
答案 0 :(得分:0)
将名称嵌入到正则表达式中所做的是正确的方法。它声明在documentation中执行此操作。
如果您的某些列已经包含名称.rename()
,0
和1
,则使用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)