如何按指定规则拆分DataFrame的name列并赋值对应列名?
解决Pandas中拆分字符串列并提取指定部分的问题
你之前的代码之所以达不到预期效果,核心问题在于不同行的name字段拆分后得到的元素数量不一样——有的是3段,有的是4段甚至5段,你固定取索引为2的元素作为leaf,自然拿不到每一行的最后一段内容。
这里给你两种简单可行的解决方法:
方法一:拆分后通过列表索引提取
先把name列拆分成列表格式,再分别提取第一个、第二个和最后一个元素,步骤清晰易懂:
# 把name列按/拆分成列表 df['split_list'] = df['name'].str.split('/') # 提取列表第一个元素作为main列 df['main'] = df['split_list'].str[0] # 提取列表第二个元素作为sub列 df['sub'] = df['split_list'].str[1] # 提取列表最后一个元素作为leaf列(用-1索引适配任意长度的列表) df['leaf'] = df['split_list'].str[-1] # 删掉临时生成的split_list列(可选) df = df.drop('split_list', axis=1)
方法二:用正则表达式一次性提取(更简洁)
利用正则表达式的分组匹配功能,直接从name字符串中捕获我们需要的三个部分,一行代码就能搞定:
# 使用正则提取main、sub、leaf三个字段 df[['main', 'sub', 'leaf']] = df['name'].str.extract(r'^([^/]+)/([^/]+).*/([^/]+)$')
这个正则的逻辑很直观:
^([^/]+):匹配开头到第一个/的内容(也就是第一段)/([^/]+):匹配第一个/之后到第二个/的内容(第二段).*:匹配中间所有的内容(不管中间有多少段,都直接跳过)/([^/]+)$:匹配最后一个/之后到结尾的内容(最后一段)
两种方法都能得到你想要的结果:
| id | name | main | sub | leaf |
|---|---|---|---|---|
| 1 | a/b/c | a | b | c |
| 2 | w/x/y/z | w | x | z |
| 3 | q/w/e/r/t | q | w | t |
内容的提问来源于stack exchange,提问作者Shubham R
相关产品推荐
相关产品推荐

