You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于两个现有DataFrame创建包含多列数值变化的新DataFrame(足球球员FIFA属性分析场景)

优化FIFA球员五年属性变化计算的实用方案

你的核心思路是完全可行的——合并两个年份的DataFrame后计算属性差值,这里给你几个能提升效率、准确性的优化建议,尤其适配你30多列属性的场景:

  • 先做好合并的基础工作:用唯一标识匹配球员
    千万不要只靠球员名字合并,很容易遇到同名的情况(比如两个叫“John Smith”的前锋)。优先用球员ID(如果数据里有的话),或者组合“全名+出生日期”作为合并键。合并的时候记得给两个年份的列加后缀,方便后续区分:

    # 假设df17是FIFA17的20岁前锋数据,df22是FIFA22的25岁前锋数据
    merged_df = pd.merge(
        df17, 
        df22, 
        on=["player_id", "full_name", "birth_date"],  # 唯一标识组合
        suffixes=("_17", "_22"),  # 给17/22年的列加后缀
        how="inner"  # 只保留两年都有记录的球员,避免无效差值
    )
    
  • 批量计算差值,避免逐列写函数
    30多列的话,逐列写计算逻辑太繁琐,用批量处理能省很多事:
    首先提取所有属性列的名称(排除球员信息类的列,比如名字、ID):

    # 获取所有17年的属性列,去掉后缀得到原始属性名
    attribute_names = [col.replace("_17", "") for col in merged_df.columns if "_17" in col]
    

    然后用循环批量生成变化列(pandas的向量化运算已经足够高效,不用额外优化):

    for attr in attribute_names:
        # 计算22年减17年的差值,直接生成带_change后缀的列
        merged_df[f"{attr}_change"] = merged_df[f"{attr}_22"] - merged_df[f"{attr}_17"]
    

    如果追求极致性能(比如数据量特别大),可以直接操作底层数组,速度会更快:

    # 获取排序后的17/22年属性列,确保顺序完全对应
    cols_17 = sorted([col for col in merged_df.columns if "_17" in col])
    cols_22 = sorted([col for col in merged_df.columns if "_22" in col])
    
    # 直接用数组减法计算差值
    change_values = merged_df[cols_22].values - merged_df[cols_17].values
    
    # 把差值转换成DataFrame,命名列名
    change_df = pd.DataFrame(
        change_values, 
        columns=[col.replace("_22", "_change") for col in cols_22],
        index=merged_df.index
    )
    
    # 合并回主DataFrame
    final_df = pd.concat([merged_df, change_df], axis=1)
    
  • 处理数据一致性问题
    提前检查两个DataFrame的属性列是否完全匹配:比如有没有17年叫tackling但22年叫tackle的情况,这种不一致会导致合并后无法对应计算。可以用这个代码快速核对:

    # 找出两个DF共有的属性列
    common_attrs = set(df17.columns) & set(df22.columns)
    # 找出只在一个DF里存在的列
    unique_to_17 = set(df17.columns) - common_attrs
    unique_to_22 = set(df22.columns) - common_attrs
    
    if unique_to_17 or unique_to_22:
        print(f"FIFA17独有的列:{unique_to_17}")
        print(f"FIFA22独有的列:{unique_to_22}")
    

    提前修正这些列名不一致的问题,避免后续计算出错。

  • 可选:生成带符号的展示格式
    如果需要像“抢断+3”“射门-1”这种可读性更强的字符串格式,可以批量生成:

    for attr in attribute_names:
        merged_df[f"{attr}_change_str"] = merged_df[f"{attr}_change"].apply(
            lambda x: f"{attr}{'+' if x > 0 else ''}{x}"
        )
    

    注意:数值型的_change列建议保留,方便后续做统计分析(比如平均变化值、top提升球员),字符串列只用来展示就好。

内容的提问来源于stack exchange,提问作者Tom Bomer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 01:18:18