首页 > 解决方案 > 正则表达式在熊猫中拆分

问题描述

你好,我有一个df,比如

COL1 
NW_011625257.1_0
NW_011623521.1_1
NW_011623521.3_1
NW_011623521.4_1
NW_011623521.1
JZSA01007324.1_2
scaffold_1463_2
scaffold_1463

我想减到最后'_'并得到

COL1              COL2
NW_011625257.1    0
NW_011623521.1    1
NW_011623521.3    1
NW_011623521.4    1
NW_011623521.1    NaN 
JZSA01007324.1    2
scaffold_1463     2
scaffold_1463     NaN

到目前为止,我尝试过:

df[['COL1','COL2']] = df.COL1.str.split(r'_(?!.*_)', expand=True)

相反,我得到了这种输出:

COL1             COL2
NW_011625257.1   0
NW_011623521.1   1
NW_011623521.3   1
NW_011623521.4   1
NW               011623521.1
JZSA01007324.1   2
scaffold_1463    2
scaffold         1463

这是我要选择的示例

在此处输入图像描述

标签: pythonregexpandas

解决方案


您可以使用

df[['COL1','COL2']] = df.COL1.str.split(r"(?<=\d)_(?=\d+$)", expand=True)

查看正则表达式演示

图案细节

  • (?<=\d)- 当前位置之前必须有一个数字
  • _- 一个下划线
  • (?=\d+$)- 当前位置的右侧必须有 1 个以上的数字和字符串的结尾。

熊猫测试:

df = pd.DataFrame({'COL1': ['NW_011625257.1_0','NW_011623521.1_1','NW_011623521.3_1','NW_011623521.4_1','NW_011623521.1','JZSA01007324.1_2','scaffold_1463_2','scaffold_1463']})
>>> df[['COL2','COL3']] = df.COL1.str.split(r"(?<=\d)_(?=\d+$)", expand=True)
>>> df
               COL1            COL2  COL3
0  NW_011625257.1_0  NW_011625257.1     0
1  NW_011623521.1_1  NW_011623521.1     1
2  NW_011623521.3_1  NW_011623521.3     1
3  NW_011623521.4_1  NW_011623521.4     1
4    NW_011623521.1  NW_011623521.1  None
5  JZSA01007324.1_2  JZSA01007324.1     2
6   scaffold_1463_2   scaffold_1463     2
7     scaffold_1463   scaffold_1463  None

推荐阅读