使用 pandas 正则表达式基于逗号字符分隔列数据
Separate column data based on comma characters using pandas regex
我有一个如下所示的数据框
df = pd.DataFrame({'val': ['V583 ,ATTENTION, PRIMARY','Y9207,INDOOR LIVING, sEcondary',' z526, liver,primary ','12345678, test, secondary',',project,']})
我想 split/segregate 列 val
数据基于 comma
个字符。
例如,所有字符 before 1st comma
应该转到 first
列
同样,所有字符 after 1st comma
和 before 2nd comma
应转到 second
列
同样,所有字符 after 2nd comma
和 before 3rd comma
应该转到 third
列
我尝试了以下
df['val'].astype(str).str.extract(r'\s*([a-zA-Z0-9\s]*)',expand=True)
我希望我的输出如下所示
使用您展示的示例,请尝试执行以下操作。这里使用 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
您可以在此处使用 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*([^,]*)$')
使用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
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*
:匹配任何白色 space 字符零次或多次
,
: 按字面意思匹配字符逗号
\s*
:匹配任何白色 space 字符零次或多次
$
:第二个选择断言行尾的位置
PS:如果您有 任意数量的逗号分隔字符串,此方法也适用。
我有一个如下所示的数据框
df = pd.DataFrame({'val': ['V583 ,ATTENTION, PRIMARY','Y9207,INDOOR LIVING, sEcondary',' z526, liver,primary ','12345678, test, secondary',',project,']})
我想 split/segregate 列 val
数据基于 comma
个字符。
例如,所有字符 before 1st comma
应该转到 first
列
同样,所有字符 after 1st comma
和 before 2nd comma
应转到 second
列
同样,所有字符 after 2nd comma
和 before 3rd comma
应该转到 third
列
我尝试了以下
df['val'].astype(str).str.extract(r'\s*([a-zA-Z0-9\s]*)',expand=True)
我希望我的输出如下所示
使用您展示的示例,请尝试执行以下操作。这里使用 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
您可以在此处使用 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*([^,]*)$')
使用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
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*
:匹配任何白色 space 字符零次或多次,
: 按字面意思匹配字符逗号\s*
:匹配任何白色 space 字符零次或多次
$
:第二个选择断言行尾的位置
PS:如果您有 任意数量的逗号分隔字符串,此方法也适用。