如何在下面的数据框中使用regex从注释中分离ID?
df=pd.DataFrame({"header":["SS50377_28860 All-trans-retinol 13,14-reductase"]})
所以列应该是这样的:
df_new=pd.DataFrame({"id":"SS50377_28860","header":["All-trans-retinol 13,14-reductase"]})
以下代码无法正常工作。
df.join(df["header"].str.split(r'd+', 0, expand=True))
提前感谢!!
您可以在数字和字母之间使用一个或多个空格进行拆分:
df[['id','header']] = df['header'].str.split(r'(?<=d)s+(?=[A-Z])', n=1, expand=True)
或者,您可以将ID模式捕获到一组中,其余捕获到另一组中:
df[['id', 'header']] = df['header'].str.extract(r'^([A-Z0-9]+_[A-Z0-9]+)s+(.*)', expand=True)
或者,您可以简单地使用第一个空白块Series.str.split
:
df[['id', 'header']] = df['header'].str.split("s+", n=1, expand=True)
输出:
>>> df
header id
0 All-trans-retinol 13,14-reductase SS50377_28860
详细信息:
(?<=d)s+(?=[A-Z])
-匹配一个或多个紧跟在数字((?<=d)
(前面并紧跟在大写ASCII字母([A-Z]
(后面的空白(s+
(^([A-Z0-9]+_[A-Z0-9]+)s+(.*)
-匹配字符串的开头(^
(,然后捕获一个或多个大写ASCII字母或数字、_
和一个或更多个大写ASCII字符或数字到组1(列"id"(,然后匹配一个或几个空白(s+
(,然后将行的其余部分捕获到组2(使用(.*)
(
您选择哪种解决方案取决于您的输入变化程度以及您希望在此处应用的验证程度。