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的调用。我借用了您的正则表达式解决方案:+回答得好。我借用了你的正则表达式解决方案:+回答得好。