如果单元格有2个单词,则只提取第一个单词;如果单元格有3个单词,请提取两个第一个单词-PANDAS/REGEX



在我的DataFrame中,我有一个名为"teams"的列。它包括城市和球队名称。我想把这个城市摘录到另一个专栏里。以下是数据帧:DataFrame样本

nba_df['team'].head(11)
    team
0   Toronto Raptors
1   Boston Celtics
2   Philadelphia 76ers
3   Cleveland Cavaliers
4   Indiana Pacers
5   Miami Heat
6   Milwaukee Bucks
7   Washington Wizards
8   Detroit Pistons
9   Charlotte Hornets
10  New York Knicks

我可以使用regex:轻松地提取列

nba_df['cities'] = nba_df.team.str.extract('(^[w*]+)', expand=True)
nba_df[['team', 'cities']].head(11)

    team                cities
0   Toronto Raptors     Toronto
1   Boston Celtics      Boston
2   Philadelphia 76ers  Philadelphia
3   Cleveland Cavaliers Cleveland
4   Indiana Pacers      Indiana
5   Miami Heat          Miami
6   Milwaukee Bucks     Milwaukee
7   Washington Wizards  Washington
8   Detroit Pistons     Detroit
9   Charlotte Hornets   Charlotte
10  New York Knicks     New

然而,在"名字"一栏中,对于纽约尼克斯队来说,它只给了我一个值:;新的";我想得到";纽约":

结果

那么,我应该怎么做,如果单元格有2个单词,我如何从开头只提取一个单词;如果单元格有3个单词,如何使用正则表达式从中提取2个单词?

对于只有2或3个字符串的场景,可以使用

^(S+(?:s+S+(?=s+S+))?)

请参阅regex演示。

详细信息

  • ^-字符串的开头
  • (S+(?:s+S+(?=s+S+))?)-捕获组1:
    • S+-一个或多个非空白字符
    • (?:s+S+(?=s+S+))?-的可选序列
      • s+-1+空白
      • S+-1+非空白
      • (?=s+S+)-紧接着是1+空白和1+非空白

以下是一些其他正则表达式选项:

  • 除最后一个单词外的所有单词^(S+(?:s+S+)*)s+S+$(演示(/^(.*S)s+S+$(演示(/^(.*?)s+S+$(演示(
  • 获取两个单词串中的第一个单词和三个单词串的两个第一个单词,并且在其他字符串中不匹配^(S+(?=s+S+$)|S+s+S+(?=s+S+$))(演示(

不要为此使用regex,除非您发现它非常可读。相反,从字符串team_name开始。。。拆分、切片和连接:

team_words = team_name.split()
team_city = team_words[:-1]
city = ' '.join(team_city)

一行:

city = ' '.join(team_name.split()[:-1])

你能很容易地把它插入你的测向广播吗?

最新更新