首页 > 解决方案 > 使用 pandas 正则表达式基于逗号字符分隔列数据

问题描述

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

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 commasecondafter 2nd commabefore 3rd commathird

我尝试了以下

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

我希望我的输出如下所示

在此处输入图像描述

标签: pythonregexpandasdataframeseries

解决方案


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:如果您有任意数量的逗号分隔字符串,此方法也可以工作。


推荐阅读