【问题标题】:Separate Dataframe column into multiple columns based on regex parameter根据正则表达式参数将 Dataframe 列分成多列
【发布时间】:2023-04-08 22:04:01
【问题描述】:

这里是熊猫菜鸟。删除每个团队记录并将其放入新列的最佳方法是什么?提前致谢!

    Rank    Team    
0   1       LA Rams (5-0)   
1   2       New Orleans (4-1)   
2   3       New England (3-2)   
3   4       Kansas City (5-0)   
4   5       Pittsburgh (2-2-1)  
5   6       Baltimore (3-2) 

【问题讨论】:

  • df[['Team', 'record']] = df.Team.str.rsplit(' ', n=1, expand=True) 应该稍微高效一些,因为它不使用正则表达式。
  • @Abdou 不错,但如果引入名称更复杂的团队,灵活性会稍差。
  • 啊,太好了,谢谢你们俩

标签: python-3.x pandas web-scraping


【解决方案1】:

有趣的问题。

不幸的是,Series.str.extract 很容易获取记录,但不会删除它(使用简单的正则表达式,如果团队名称中有 (...),请随意使用更复杂的正则表达式):

df['Record'] = df['Team'].str.extract('(\(.*?\))')
print(df)
#    Rank                Team   record
#  0    1       LA Rams (5-0)    (5-0)
#  1    2   New Orleans (4-1)    (4-1)
#  2    3   New England (3-2)    (3-2)
#  3    4   Kansas City (5-0)    (5-0)
#  4    5  Pittsburgh (2-2-1)  (2-2-1)
#  5    6     Baltimore (3-2)    (3-2)

这需要实现我们自己的功能:

import re

record_regex = re.compile(r'(\(.*?\))')

records = []

def extract_and_remove_record(x):
    record = record_regex.findall(x)[0]
    records.append(record)
    return record_regex.sub('', x)

df['Team'] = df['Team'].apply(extract_and_remove_record)
df['Record'] = records

print(df)
#    Rank          Team  Records
#  0    1      LA Rams     (5-0)
#  1    2  New Orleans     (4-1)
#  2    3  New England     (3-2)
#  3    4  Kansas City     (5-0)
#  4    5   Pittsburgh   (2-2-1)
#  5    6    Baltimore     (3-2)

【讨论】:

  • 非常感谢!这让我的宿醉更加严重:D 你摇滚@DeepSpace
【解决方案2】:

另一种不涉及正则表达式技巧的方法。

df[['Team Name', 'Team Records']] = d.Team.apply(lambda x: pd.Series(x.rstrip(')').split(' (')))
df.drop('Team', axis=1, inplace=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2021-07-09
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    相关资源
    最近更新 更多