Python 如何按大写字母分解字符串并生成更多行[熊猫]

Python 如何按大写字母分解字符串并生成更多行[熊猫],python,pandas,dataframe,split,Python,Pandas,Dataframe,Split,这是我的问题 如果我有如下数据帧: Metropolitan area Population NHL 0 New York City 20153634 RangersIslandersDevils 1 Los Angeles 13310447 KingsDucks 2 Washington 23131112

这是我的问题

如果我有如下数据帧:

         Metropolitan area Population                     NHL
0            New York City   20153634  RangersIslandersDevils
1              Los Angeles   13310447              KingsDucks
2               Washington   23131112              New London
3                  Alabama   11111112                Lighting
         Metropolitan area Population                     NHL
0            New York City   20153634                 Rangers
1            New York City   20153634               Islanders
2            New York City   20153634                  Devils
3              Los Angeles   13310447                   Kings
4              Los Angeles   13310447                   Ducks
5               Washington   23131112              New London
6                  Alabama   11111112                Lighting
我想得到一个新的数据帧,如:

         Metropolitan area Population                     NHL
0            New York City   20153634  RangersIslandersDevils
1              Los Angeles   13310447              KingsDucks
2               Washington   23131112              New London
3                  Alabama   11111112                Lighting
         Metropolitan area Population                     NHL
0            New York City   20153634                 Rangers
1            New York City   20153634               Islanders
2            New York City   20153634                  Devils
3              Los Angeles   13310447                   Kings
4              Los Angeles   13310447                   Ducks
5               Washington   23131112              New London
6                  Alabama   11111112                Lighting
因此,如您所见,我需要按大写字母拆分NHL团队名称,但如果名称中有空格,则不应执行任何操作。

这里有一种方法:

df.drop('NHL', axis=1).merge(df['NHL'].str.extractall('([A-Z](?:\s[A-Z]|[^A-Z])+)')
                                      .reset_index(level=1, drop=True)
                                      .rename(columns={0:'NHL'}), 
                             left_index=True, right_index=True)
输出:

 Metropolitan area  Population         NHL
0     New York City    20153634     Rangers
0     New York City    20153634   Islanders
0     New York City    20153634      Devils
1       Los Angeles    13310447       Kings
1       Los Angeles    13310447       Ducks
2        Washington    23131112  New London
3           Alabama    11111112    Lighting
借用@CameronRiddell正则表达式纠正解析团队。

这里有一种方法:

df.drop('NHL', axis=1).merge(df['NHL'].str.extractall('([A-Z](?:\s[A-Z]|[^A-Z])+)')
                                      .reset_index(level=1, drop=True)
                                      .rename(columns={0:'NHL'}), 
                             left_index=True, right_index=True)
输出:

 Metropolitan area  Population         NHL
0     New York City    20153634     Rangers
0     New York City    20153634   Islanders
0     New York City    20153634      Devils
1       Los Angeles    13310447       Kings
1       Los Angeles    13310447       Ducks
2        Washington    23131112  New London
3           Alabama    11111112    Lighting

借用@CameronRiddell正则表达式来纠正解析团队。

您可以使用findall和explode的组合:


您可以使用findall和explode的组合:

这可以通过以下方式进行更新:

import re
df1 = df[df["NHL"].str.contains(" ")]
df2 = df[~df["NHL"].str.contains(" ")]
df2["NHL"] = df2.apply(lambda x: re.findall(r"[A-Z][^A-Z]*", x["NHL"]), axis=1)
df2 = df2.explode("NHL")
pd.concat([df2,df1])
这可以通过以下方式进行更新:

import re
df1 = df[df["NHL"].str.contains(" ")]
df2 = df[~df["NHL"].str.contains(" ")]
df2["NHL"] = df2.apply(lambda x: re.findall(r"[A-Z][^A-Z]*", x["NHL"]), axis=1)
df2 = df2.explode("NHL")
pd.concat([df2,df1])

你有NHL团队名称的列表吗?是的,在这个例子的NHL列中df有3列,包括这个NHL列,你误解了我的问题。不是每个人都熟悉NHL,我们怎么知道流浪者是一个团队名称,而不是流浪者诽谤?啊哈,我从这里知道:你有NHL团队名称的列表吗?是的,在这个例子中的NHL列中df有3列,包括这个NHL列。你误解了我的问题。不是每个人都熟悉NHL,我们怎么知道流浪者是一个球队的名字,而不是流浪者诽谤?啊哈,我从这里知道:这个独立的新伦敦:-ARG@广宏,你说得对。我们需要一个包含所有团队名称的列表。好的,我借用了@CameronRiddell regex解决方案。感谢您对regex的信任!作为您答案的额外说明,您可以使用.join…简化任何合并…,left_index=True,right_index=True的调用。这个单独的新伦敦:-ARG@广宏,你说得对。我们需要一个包含所有团队名称的列表。好的,我借用了@CameronRiddell regex解决方案。感谢您对regex的信任!作为回答的额外说明,您可以使用.join…简化任何合并…、left_index=True、right_index=True的调用。我借用了您的正则表达式解决方案:+回答得好。我借用了你的正则表达式解决方案:+回答得好。