如何基于两个现有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
相关产品推荐
相关产品推荐

