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
相关产品推荐
相关产品推荐

