python - 使用 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 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)
我希望我的输出如下所示
解决方案
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:如果您有任意数量的逗号分隔字符串,此方法也可以工作。
推荐阅读
- php - PHP imap 不附加大邮件
- javascript - 使用循环创建数据数组
- javascript - TypeScript var scope versus JavaScript var scope
- php - 用于排序的 orderColumn 不适用于 yajra 数据表
- node.js - 没有导出的成员
- javascript - 如何在 Vue 中更新“v-if”切换的画布?
- python - Python Socket,我如何在 s.send 和 conn.send 之间进行选择?
- c++ - 如何调用原子成员函数指针
- kubernetes - Kubernetes Wordpress 的入口
- xamarin.forms - 项目 App.Droid 无法使用 TargetFrameworkVersion v8.1 构建,因为它不受支持