使用pd.concat合并DataFrame触发ValueError: no types given求助
问题排查与解决
错误核心原因:列名隐藏差异
触发ValueError: no types given的本质是两个DataFrame列名不匹配——从CSV读取的PerfsL12列名带有前导空格(比如' Date'、' Used_players'),而网页读取后手动设置列名的PerfsL1列名无空格('Date'、'Used_players'),pd.concat找不到对应列的匹配类型,因此报错。
验证方法
先打印两个DataFrame的列名,直观确认差异:
print("PerfsL1列名:", PerfsL1.columns.tolist()) print("PerfsL12列名:", PerfsL12.columns.tolist())
输出会显示PerfsL12的列名前存在空格,和PerfsL1的列名完全不对应。
修复步骤
方法1:读取CSV时自动去除列名空格
修改CSV读取代码,用rename批量去掉列名前后的空格:
PerfsL12 = pd.read_csv('Ligue_1_Perfs.csv', index_col=0).rename(columns=lambda x: x.strip())
方法2:强制对齐列名
如果方法1无效,直接将PerfsL12的列名替换为PerfsL1的列名列表:
PerfsL12.columns = PerfsL1.columns
可选:统一数据类型(避免后续异常)
合并前确认对应列的数据类型一致,比如检查:
print(PerfsL1.dtypes) print(PerfsL12.dtypes)
若某列类型不一致(比如age在一个DataFrame中是字符串,另一个是数值),用pd.to_numeric统一转换:
# 示例:批量转换数值列类型 numeric_cols = ['age', 'Possesion', 'nb_matchs', 'Buts', 'Assists'] for col in numeric_cols: PerfsL1[col] = pd.to_numeric(PerfsL1[col], errors='coerce') PerfsL12[col] = pd.to_numeric(PerfsL12[col], errors='coerce')
修改后的完整代码
import datetime import pandas as pd Aujourdhui = datetime.datetime.now().strftime("%X") PerfsL1 = pd.read_html('https://fbref.com/fr/comps/13/stats/Statistiques-Ligue-1#all_stats_standard', header=1)[0] PerfsL1.columns = ['Équipe', 'Used_players', 'age', 'Possesion', "nb_matchs", "Starts", "Min", '90s','Buts','Assists', 'No_penaltis', 'Penaltis', 'Penaltis_tentes', 'Cartons_jaunes', 'Cartons_rouges', 'Buts/90mn','Assists/90mn', 'B+A /90mn', 'NoPenaltis/90mn', 'B+A+P/90mn','Exp_buts','Exp_NoPenaltis', 'Exp_Assists', 'Exp_NP+A', 'Exp_buts/90mn', 'Exp_Assists/90mn','Exp_B+A/90mn','Exp_NoPenaltis/90mn', 'Exp_NP+A/90mn'] PerfsL1.insert(0, "Date", Aujourdhui) # 修复列名空格问题 PerfsL12 = pd.read_csv('Ligue_1_Perfs.csv', index_col=0).rename(columns=lambda x: x.strip()) # 统一数值列类型 numeric_cols = ['age', 'Possesion', 'nb_matchs', 'Buts', 'Assists'] for col in numeric_cols: PerfsL1[col] = pd.to_numeric(PerfsL1[col], errors='coerce') PerfsL12[col] = pd.to_numeric(PerfsL12[col], errors='coerce') # 执行合并 PerfsL1 = pd.concat([PerfsL1, PerfsL12], ignore_index=True) print(PerfsL1)
内容的提问来源于stack exchange,提问作者JoJoWasACode
相关产品推荐
相关产品推荐

