繁体   English   中英

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

[英]If cell has 2 words, extract only 1st word and if cell has 3 words, extract 2 first words - PANDAS/REGEX

在我的 DataFrame 中,我有一个名为“团队”的列。 它包括城市和团队名称。 我想将城市提取到另一列中。 这是 dataframe: 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

我可以使用正则表达式轻松提取列:

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

但是,在纽约尼克斯队的“名称”列中,它只给我以下值:“New”,我想得到“New York”:

结果

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

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

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

请参阅正则表达式演示

细节

  • ^ - 字符串的开始
  • (\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+$))演示

不要为此纠结于正则表达式,除非你觉得它非常可读。 相反,从字符串team_name开始......拆分、切片和连接:

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

在一行中:

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

你能很容易地将它放入你的 DF 广播中吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM