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

Python如何拆分DataFrame单元格内的字典列表生成指定结构的DataFrame?

Pandas嵌套字典列表列拆分实现方案

以下是针对需求的可直接运行实现代码,提供两种实现思路:

方法1:鲁棒性实现(不依赖列表元素顺序)

该方案通过判断periodvalue字段区分上下半场,就算列表内上下半场顺序错乱也能正确取值:

import pandas as pd

# 1. 构造原始示例DataFrame,你实际使用时替换为自己读取的DataFrame即可
df = pd.DataFrame({
    'matchNum': [78, 56],
    'accumulatedscore': [
        [{'periodvalue': 'FirstHalf', 'periodstatus': 'ResultFinal', 'home': '0', 'away': '0'}, {'periodvalue': 'SecondHalf', 'periodstatus': 'ResultFinal', 'home': '1', 'away': '0'}],
        [{'periodvalue': 'FirstHalf', 'periodstatus': 'ResultFinal', 'home': '2', 'away': '1'}, {'periodvalue': 'SecondHalf', 'periodstatus': 'ResultFinal', 'home': '4', 'away': '3'}]
    ]
})

# 2. 定义得分提取函数
def extract_score(score_list):
    home1 = away1 = home2 = away2 = None
    for item in score_list:
        if item['periodvalue'] == 'FirstHalf':
            home1 = int(item['home'])
            away1 = int(item['away'])
        elif item['periodvalue'] == 'SecondHalf':
            home2 = int(item['home'])
            away2 = int(item['away'])
    return pd.Series([home1, away1, home2, away2], index=['home1', 'away1', 'home2', 'away2'])

# 3. 应用函数拆分列,生成目标结构
df[['home1', 'away1', 'home2', 'away2']] = df['accumulatedscore'].apply(extract_score)
result = df[['matchNum', 'home1', 'away1', 'home2', 'away2']]

# 输出验证
print(result)

方法2:简洁实现(依赖列表元素固定顺序)

如果可以确保accumulatedscore列的列表中,第一个元素永远是上半场、第二个永远是下半场,可以使用更简洁的写法:

import pandas as pd

# 构造原始DataFrame步骤同上
df = pd.DataFrame({
    'matchNum': [78, 56],
    'accumulatedscore': [
        [{'periodvalue': 'FirstHalf', 'periodstatus': 'ResultFinal', 'home': '0', 'away': '0'}, {'periodvalue': 'SecondHalf', 'periodstatus': 'ResultFinal', 'home': '1', 'away': '0'}],
        [{'periodvalue': 'FirstHalf', 'periodstatus': 'ResultFinal', 'home': '2', 'away': '1'}, {'periodvalue': 'SecondHalf', 'periodstatus': 'ResultFinal', 'home': '4', 'away': '3'}]
    ]
})

# 直接按索引取值拆分
df['home1'] = df['accumulatedscore'].str[0].str['home'].astype(int)
df['away1'] = df['accumulatedscore'].str[0].str['away'].astype(int)
df['home2'] = df['accumulatedscore'].str[1].str['home'].astype(int)
df['away2'] = df['accumulatedscore'].str[1].str['away'].astype(int)

result = df[['matchNum', 'home1', 'away1', 'home2', 'away2']]
print(result)

两种方法最终输出的结果都和你给出的目标结构完全一致。

内容的提问来源于stack exchange,提问作者Chai Christo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:15:02