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

如何展平含嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:17:32