使用Pandas将特定格式字符串拆分转换为DataFrame遇阻求助
嘿,我来帮你搞定这个字符串转DataFrame的问题!你遇到的核心痛点是球员名包含空格,直接按空格拆分肯定会乱套对吧?别担心,用正则表达式就能精准提取每个字段,下面是具体的解决步骤:
解决方法
我们的思路是用正则匹配每行的固定结构(位置+带空格的球员名+浮点评分),再把提取到的内容整理成DataFrame。
步骤1:导入必要的库
import pandas as pd import re
步骤2:预处理原始字符串
先把你的原始字符串拆分成单独的行,过滤掉空行和多余的空格:
raw_str = '''Position Players Average Form Goalkeeper Manuel Neuer 4.17017132535 Defender Diego Godin 4.14973163459 Defender Giorgio Chiellini 4.10115207373 Defender Thiago Silva 3.93318274318 Defender Andrea Barzagli 3.85132973289 Midfielder Arjen Robben 4.80556193806 Midfielder Alexander Meier 4.51037598508 Midfielder F...''' # 按换行拆分,同时去掉每行首尾的空格,过滤空行 lines = [line.strip() for line in raw_str.splitlines() if line.strip()] # 跳过第一行的标题,只保留数据行 data_lines = lines[1:]
步骤3:用正则提取字段
我们写一个正则模式,专门匹配「位置(单个单词)+ 球员名(可含空格)+ 浮点评分」的结构:
# 正则说明:^匹配行开头,(\w+)抓位置,(.*?)非贪婪抓球员名,(\d+\.\d+)抓评分 pattern = re.compile(r'^(\w+)\s+(.*?)\s+(\d+\.\d+)$') # 遍历每行提取有效数据 processed_data = [] for line in data_lines: match_result = pattern.match(line) if match_result: # 只处理格式完整的行,自动跳过像"Midfielder F..."这种截断内容 position = match_result.group(1) player_name = match_result.group(2) rating = float(match_result.group(3)) processed_data.append([position, player_name, rating])
步骤4:转换为DataFrame
最后把整理好的数据转成DataFrame,设置对应的列名:
df = pd.DataFrame(processed_data, columns=['Position', 'Player', 'Average Form']) print(df)
运行后你会得到这样的结果:
Position Player Average Form 0 Goalkeeper Manuel Neuer 4.170171 1 Defender Diego Godin 4.149732 2 Defender Giorgio Chiellini 4.101152 3 Defender Thiago Silva 3.933183 4 Defender Andrea Barzagli 3.851330 5 Midfielder Arjen Robben 4.805562 6 Midfielder Alexander Meier 4.510376
这里的关键是用.*?做非贪婪匹配,它会在遇到最后一个空格+数字时停止,刚好完整提取出带空格的球员名,不会把评分的内容拆进去。
内容的提问来源于stack exchange,提问作者user9663157
相关产品推荐
相关产品推荐

