如何展平含嵌套statistics字典的足球赛事DataFrame?
搞定嵌套统计列的展平问题!
嘿,作为数据分析新手遇到这种嵌套结构确实有点头疼,我来一步步帮你解决,顺便给你提些提问优化的小建议~
核心解决步骤
首先咱们理清思路:你需要把statistics列里的每个统计项(比如Goal Attempts)拆成{统计项}_home和{统计项}_away的独立列,我给你一套直接能用的代码:
1. 先加载并预处理数据
假设你的数据是JSON格式(CSV的话也类似,只是多一步解析嵌套列):
import pandas as pd import json # 如果是CSV需要用到这个解析嵌套字符串 # 加载JSON数据 df = pd.read_json('your_matches_data.json') # 如果是CSV文件,注意statistics列可能是字符串格式的字典列表,需要先解析: # df = pd.read_csv('your_matches_data.csv') # df['statistics'] = df['statistics'].apply(json.loads)
2. 自定义函数展平嵌套统计项
写一个小函数,把每行的statistics列表转换成带目标列名的Series,然后和原表合并:
def flatten_statistics(stats_list): flat_data = {} for stat_item in stats_list: # 把统计项名称里的空格去掉,比如"Goal Attempts"变成"GoalAttempts" clean_stat_name = stat_item['type'].replace(' ', '') # 生成home和away的列名并赋值 flat_data[f"{clean_stat_name}_home"] = stat_item['home'] flat_data[f"{clean_stat_name}_away"] = stat_item['away'] return pd.Series(flat_data) # 把展平后的统计列和原DataFrame合并,去掉原来的statistics列 final_flat_df = pd.concat( [df.drop('statistics', axis=1), df['statistics'].apply(flatten_statistics)], axis=1 )
运行完这段代码,你就能得到完全扁平的DataFrame,每个统计项都有对应的home/away独立列啦~
为什么之前的pd.concat没生效?
大概率是你直接对statistics列调用了pd.concat,但这个列里的元素是列表,不是结构化的DataFrame/Series,直接concat会把列表拆成多行而不是你想要的列。上面的方法先把每个列表转成带目标列的Series,再按列合并就对了。
提问优化小建议
下次提问的时候补充这些信息,能让大家更快精准帮到你:
- 贴出2-3行的样本数据(敏感信息可以模糊处理),比如一小段JSON/CSV内容,这样别人能准确理解你的数据结构
- 说明你之前用的
pd.concat代码具体是什么,以及你得到的“非预期结果”到底是啥(比如是生成了重复行?还是列名不对?) - 提一下你用的pandas版本,不同版本的函数偶尔会有小差异
内容的提问来源于stack exchange,提问作者Engin Ba
相关产品推荐
相关产品推荐

