使用正则表达式基于逗号字符分隔列数据

2024-09-30 12:11:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下所示的数据帧

df = pd.DataFrame({'val': ['V583 ,ATTENTION, PRIMARY','Y9207,INDOOR LIVING, sEcondary',' z526, liver,primary ','12345678, test, secondary',',project,']})

我想基于comma字符分割/隔离列val数据

例如,所有字符before 1st comma都应该转到first列 同样,所有字符after 1st commabefore 2nd comma都应该转到second列 同样,所有字符after 2nd commabefore 3rd comma都应该转到third

我试过下面的方法

df['val'].astype(str).str.extract(r'\s*([a-zA-Z0-9\s]*)',expand=True)

我希望我的输出如下所示

enter image description here


Tags: 数据dataframedfval字符pdattentionafter
3条回答

您可以在此处使用str.extract,如下所示:

df["first"] = df["val"].str.extract(r'^\s*(.*?)\s*,')
df["second"] = df["val"].str.extract(r',\s*(.*?)\s*,')
df["third"] = df["val"].str.extract(r',\s*([^,]*)$')

有了您展示的样品,请尝试以下内容。在这里使用Pandas的^{}函数。简单的解释是:在extract中提到regex以在DataFrame中创建3个新列。它基本上是根据显示的示例为每个新字段创建3个捕获组

df[["first", "second", "third"]] =  df['val'].str.extract(r'^([^,]*),([^,]*),(.*)$',expand=True)

Here is online demo of above regex

df的输出如下所示:

                              val     first         second       third
0        V583 ,ATTENTION, PRIMARY     V583       ATTENTION     PRIMARY
1  Y9207,INDOOR LIVING, sEcondary     Y9207  INDOOR LIVING   sEcondary
2            z526, liver,primary       z526          liver    primary 
3       12345678, test, secondary  12345678           test   secondary
4                       ,project,                  project            

Series.str.extractall

我们可以extract将所有出现的捕获组指定为regex模式,然后unstack进行重塑

df['val'].str.extractall(r'([^,]+)(?:\s*,\s*|$)')[0].unstack()

match         0              1          2
0         V583       ATTENTION    PRIMARY
1         Y9207  INDOOR LIVING  sEcondary
2          z526          liver   primary 
3      12345678           test  secondary
4       project            NaN        NaN

正则表达式详细信息:

  • ([^,]+):第一捕获组
    • [^,]+:匹配列表中不存在的任何字符[,]一次或多次
  • (?:\s*,\s*|$):非捕获组
    • \s*,\s*:第一种选择
      • \s*:匹配任何空白字符零次或多次
      • ,:按字面意思匹配字符逗号
      • \s*:匹配任何空白字符零次或多次
    • $:第二个备选方案断言行末尾的位置

PS:如果您有任意数量的逗号分隔字符串,此方法也可以使用。

相关问题 更多 >

    热门问题