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

2024-07-03 06:59:17 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的数据框架中,我有一个名为“teams”的列。它包括城市和球队名称。我想把这个城市压缩成另一个纵队。以下是数据帧: DataFrame sample

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

然而,在纽约尼克斯队的“名称”一栏中,它只给了我“新”的值,我想得到“纽约”:

Result

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


Tags: dfnew单词bostonteamnbacharlottecleveland
2条回答

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

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

regex demo

详细信息

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

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

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

不要为此与正则表达式抗争,除非您发现它非常可读。相反,从字符串team_name开始。。。拆分、切片和联接:

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

一行:

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

你能很容易地把它插入你的DF广播吗

相关问题 更多 >