如何修改从CSV导入的Pandas DataFrame数据格式?
用Pandas转换对阵+赔率CSV数据结构
步骤说明
你的核心需求是把「每组首行存对阵信息、后续行存对应赔率」的结构,转换成「每行包含完整对阵+赔率」的格式,核心思路是标记对阵行→向下填充对阵信息→过滤并整理数据,具体代码如下:
假设原始数据结构
先明确你的CSV大概结构(以3列为例,列名导入后为0,1,2):
index | 0 | 1 | 2 0 | Milan | Draw | Juventus 1 | 2.1 | 3.4 | 3.2 2 | 1.9 | 3.5 | 3.3 3 | Barcelona | Draw | RealMadrid 4 | 2.0 | 3.6 | 3.1
具体代码实现
- 导入数据(你已经解决了Unnamed列问题,这里直接沿用你的导入方式)
import pandas as pd # 假设你的CSV无表头,用header=None;如果有表头,去掉这个参数 df = pd.read_csv('your_data.csv', index_col=0, header=None)
- 标记对阵行
通过判断是否包含固定值Draw来识别对阵行(如果你的平局标识不是Draw,替换成对应值):
df['is_match'] = df[1] == 'Draw'
- 向下填充对阵信息
把对阵行的主队、客队信息填充到下面的赔率行:
# 提取对阵行的主队、客队信息,然后向下填充 df['home_team'] = df.loc[df['is_match'], 0].ffill() df['away_team'] = df.loc[df['is_match'], 2].ffill()
- 过滤并整理数据
去掉原始的对阵行,重命名赔率列并转换数据类型:
# 过滤掉对阵行,只保留赔率行 final_df = df[~df['is_match']].copy() # 重命名赔率列 final_df = final_df.rename(columns={0: 'home_odds', 1: 'draw_odds', 2: 'away_odds'}) # 转换赔率列为数值类型 final_df[['home_odds', 'draw_odds', 'away_odds']] = final_df[['home_odds', 'draw_odds', 'away_odds']].astype(float) # 整理列顺序(按需调整) final_df = final_df[['home_team', 'away_team', 'home_odds', 'draw_odds', 'away_odds']]
最终结果
处理后的数据结构如下:
index | home_team | away_team | home_odds | draw_odds | away_odds 1 | Milan | Juventus | 2.1 | 3.4 | 3.2 2 | Milan | Juventus | 1.9 | 3.5 | 3.3 4 | Barcelona | RealMadrid | 2.0 | 3.6 | 3.1
特殊情况处理
- 如果你的平局标识不是
Draw,替换df['is_match'] = df[1] == 'Draw'中的Draw为实际值; - 如果原始数据的赔率列是带逗号的字符串(比如
2,1),先做替换:final_df['home_odds'] = final_df['home_odds'].str.replace(',', '.').astype(float); - 如果数据量极大(千万行级别),可以用
df.loc代替链式操作,减少内存占用。
内容的提问来源于stack exchange,提问作者eestlane
相关产品推荐
相关产品推荐

