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

时间:2021-04-23 04:05:50

标签: python regex pandas dataframe series

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

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

我想根据 val 字符拆分/隔离列 comma 数据。

例如,所有字符 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

4 个答案:

答案 0 :(得分:3)

使用您显示的示例,请尝试以下操作。在这里使用 Pandas 的 extract 函数。简单的解释是:在提取中提及正则表达式以在 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            

答案 1 :(得分:3)

Series.str.extractall

我们可以 extract 指定为正则表达式模式的捕获组的所有出现,然后 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:如果您有任意数量的逗号分隔字符串,此方法也适用。

答案 2 :(得分:1)

您可以在此处使用 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*([^,]*)$')

答案 3 :(得分:1)

使用str.split(expand=True)

  df.join(df['val'].str.split(',', expand=True).rename(columns={0:'first',1:'second',2:'third'}))

                              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