Pandas数组列展开异常:x列固定为't2',需生成9行目标结果
解决Pandas中列表列展开为多行的问题
问题分析
你的代码里,df['complete_schedule'].apply(lambda x: pd.Series(x[0]))这一步错误地取了每个列表的第一个元素(x[0]),所以只把每行的第一个字典展开成列,最终只得到3行数据。要实现9行的目标结果,需要先把列表拆分成单独行,再展开字典。
修正方案
通过explode方法先将列表列拆分为多行,再对拆分后的字典列进行展开即可:
修改后的完整代码
import pandas as pd rows = [{'id': 'x1', 'seq': 0, 'amount': 2000, 'payments': 4, 'dummy': 1 }, {'id': 'x2', 'seq': 0, 'amount': 4000, 'payments': 2, 'dummy': 11 }, {'id': 'x3', 'seq': 0, 'amount': 9000, 'payments': 3, 'dummy': 111 }] df = pd.DataFrame(rows) def generate_array(row): times2 = row['amount'] + row['payments'] * 2 times3 = row['amount'] + row['payments'] * 3 times4 = row['amount'] + row['payments'] * 4 result = [ { 'x': 't2', 'y': times2 }, { 'x': 't3', 'y': times3 }, { 'x': 't4', 'y': times4 } ] return result df['complete_schedule'] = df.apply(generate_array, axis=1) # 1. 将列表拆分为独立行 df_exploded = df.explode('complete_schedule') # 2. 把字典格式的列展开为x、y列 df_normalized = pd.json_normalize(df_exploded['complete_schedule']) print(df_normalized)
输出结果
x y 0 t2 2008 0 t3 2012 0 t4 2016 1 t2 4004 1 t3 4006 1 t4 4008 2 t2 9006 2 t3 9009 2 t4 9012
关键步骤说明
explode('complete_schedule'):将每行的列表元素拆分成独立行,原3行数据直接扩展为9行,每行对应一个字典元素。pd.json_normalize():专门用于展开字典格式的列,生成对应的字段列,比apply(pd.Series)效率更高,适合处理大规模数据。
如果需要保留原DataFrame的id、seq等其他字段,直接用df_exploded.join(df_normalized)即可合并完整结果。
内容的提问来源于stack exchange,提问作者ps0604
相关产品推荐
相关产品推荐

