首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将字符串从一列拆分为与列表匹配的两列?

如何将字符串从一列拆分为与列表匹配的两列?
EN

Stack Overflow用户
提问于 2020-02-04 17:18:25
回答 2查看 64关注 0票数 0

如何将字符串从一列拆分为与从右开始的列表完全匹配的两列?如果不匹配,只需为模型列保留空白。

要比较['PILOT', 'SRP637', '103', 'Mako', 'Kontiki', 'SKX007', 'Odyssey','Octo', 'Royal Oak Offshore']的列表

DataFrame

代码语言:javascript
复制
  brand
0 ARCHIMEDE PILOT
1 Seiko SRP637
2 Sinn 103
3 Orient Mako
4 Eterna Kontiki
5 Seiko SKX007
6 Boldr Odyssey
7 Bvlgari Octo
8 Aegir
9 Audemars Piguet Royal Oak Offshore

分裂成这个数据框架

代码语言:javascript
复制
  brand           model
0 ARCHIMEDE       PILOT
1 Seiko           SRP637
2 Sinn            103
3 Orient          Mako
4 Eterna          Kontiki
5 Seiko           SKX007
6 Boldr           Odyssey
7 Bvlgari         Octo
8 Aegir
9 Audemars Piguet Royal Oak Offshore
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-04 17:34:59

MCVE

代码语言:javascript
复制
import pandas as pd
from io import StringIO

textfile = StringIO("""
   brand
0  ARCHIMEDE PILOT
1  Seiko SRP637
2  Sinn 103
3  Orient Mako
4  Eterna Kontiki
5  Seiko SKX007
6  Boldr Odyssey
7  Bvlgari Octo
8  Aegir
9  Audemars Piguet Royal Oak Offshore""")

df = pd.read_csv(textfile, sep='\s\s+', engine='python')

print("Input dataframe...\n")
print(df.to_markdown())

listcomp = ['PILOT', 'SRP637', '103', 'Mako', 'Kontiki', 'SKX007', 'Odyssey','Octo', 'Royal Oak Offshore']
regex = f'{"|".join(listcomp)}'
df['model'] = df['brand'].str.extract(f'(?P<model>{regex})')
df['brand'] = df['brand'].str.replace(regex,'')
print("Output dataframe...\n")
print(df.to_markdown())

产出:

代码语言:javascript
复制
Input dataframe...

|    | brand                              |
|---:|:-----------------------------------|
|  0 | ARCHIMEDE PILOT                    |
|  1 | Seiko SRP637                       |
|  2 | Sinn 103                           |
|  3 | Orient Mako                        |
|  4 | Eterna Kontiki                     |
|  5 | Seiko SKX007                       |
|  6 | Boldr Odyssey                      |
|  7 | Bvlgari Octo                       |
|  8 | Aegir                              |
|  9 | Audemars Piguet Royal Oak Offshore |
Output dataframe...

|    | brand           | model              |
|---:|:----------------|:-------------------|
|  0 | ARCHIMEDE       | PILOT              |
|  1 | Seiko           | SRP637             |
|  2 | Sinn            | 103                |
|  3 | Orient          | Mako               |
|  4 | Eterna          | Kontiki            |
|  5 | Seiko           | SKX007             |
|  6 | Boldr           | Odyssey            |
|  7 | Bvlgari         | Octo               |
|  8 | Aegir           | nan                |
|  9 | Audemars Piguet | Royal Oak Offshore |

备选案文1:

.str.split先利用熊猫在太空上分裂,然后使用whereisin

代码语言:javascript
复制
listcomp = ['PILOT', 'SRP637', '103', 'Mako', 'Kontiki', 'SKX007', 'Odyssey','Octo']
df_out = df['brand'].str.split(' ', expand=True).set_axis(['brand', 'model'], axis=1, inplace=False)
df_out['model'] = df_out['model'].where(df_out['model'].isin(listcomp))
df_out

输出:

代码语言:javascript
复制
|    | brand     | model   |
|---:|:----------|:--------|
|  0 | ARCHIMEDE | PILOT   |
|  1 | Seiko     | SRP637  |
|  2 | Sinn      | 103     |
|  3 | Orient    | Mako    |
|  4 | Eterna    | Kontiki |
|  5 | Seiko     | SKX007  |
|  6 | Boldr     | Odyssey |
|  7 | Bvlgari   | Octo    |
|  8 | Aegir     | nan     |

选项2

将.str.extract与命名组一起使用

代码语言:javascript
复制
listcomp = ['PILOT', 'SRP637', '103', 'Mako', 'Kontiki', 'SKX007', 'Odyssey','Octo']
regex = f'{"|".join(listcomp)}'
df['brand'].str.extract(f'(?P<brand>\w+)\s?(?P<model>{regex})?')

输出:

代码语言:javascript
复制
|    | brand     | model   |
|---:|:----------|:--------|
|  0 | ARCHIMEDE | PILOT   |
|  1 | Seiko     | SRP637  |
|  2 | Sinn      | 103     |
|  3 | Orient    | Mako    |
|  4 | Eterna    | Kontiki |
|  5 | Seiko     | SKX007  |
|  6 | Boldr     | Odyssey |
|  7 | Bvlgari   | Octo    |
|  8 | Aegir     | nan     |

备选方案3(更新修改后的问题和数据)

代码语言:javascript
复制
listcomp = ['PILOT', 'SRP637', '103', 'Mako', 'Kontiki', 'SKX007', 'Odyssey','Octo', 'Royal Oak Offshore']
regex = f'{"|".join(listcomp)}'
df['model'] = df['brand'].str.extract(f'(?P<model>{regex})')
df['brand'] = df['brand'].str.replace(regex,'')
df

输出:

代码语言:javascript
复制
|    | brand           | model              |
|---:|:----------------|:-------------------|
|  0 | ARCHIMEDE       | PILOT              |
|  1 | Seiko           | SRP637             |
|  2 | Sinn            | 103                |
|  3 | Orient          | Mako               |
|  4 | Eterna          | Kontiki            |
|  5 | Seiko           | SKX007             |
|  6 | Boldr           | Odyssey            |
|  7 | Bvlgari         | Octo               |
|  8 | Aegir           | nan                |
|  9 | Audemars Piguet | Royal Oak Offshore |
票数 3
EN

Stack Overflow用户

发布于 2020-02-04 17:25:34

如果我理解得对,你想要这样:

代码语言:javascript
复制
df['model'] = df['brand'].apply(lambda x: x.split(' ')[1])

它接受每个brand行,通过空格将其分割成两部分,并将第二个元素作为新列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60062484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档