如何在Python中将特定结构的嵌套列表转换为指定格式DataFrame
解决方法:将嵌套列表转换为指定格式的DataFrame
作为Python新手,别担心,我会一步步带你实现这个需求。首先我们需要用到pandas库(处理表格数据的神器)和numpy库(用来生成空值),如果还没安装的话,先在命令行里运行:
pip install pandas numpy
接下来看具体代码和解释:
步骤1:整理原始数据
你提供的原始列表里有个多余的空元素,我先帮你修正了,确保数据结构是每5个元素为一组(标识、国家、日期列表、数值1列表、数值2列表):
import pandas as pd import numpy as np # 修正后的原始数据(移除了多余的空元素) raw_data = [ ['A'], ['America'], ['2017-39', '2017-40', '2017-41', '2017-42', '2017-43'], [10.0, 6.0, 6.0, 6.0, 1.0], [5.0,7.0,8.0,9.0,1.0], ['B'], ['Britan'], ['2017-38', '2017-39', '2017-40', '2017-41', '2017-42', '2017-43', '2017-44'], [41.0, 27.0, 38.0, 36.0, 33.0, 41.0, 8.0], [40.0, 38.0, 28.0, 27.0, 23.0, 65.0, 4.0] ]
步骤2:分组处理数据
我们把原始数据按每5个元素分成一组,这样每组对应一个国家的完整数据:
# 将原始数据拆分为多个组,每组包含一个国家的所有信息 groups = [raw_data[i:i+5] for i in range(0, len(raw_data), 5)]
步骤3:生成每组的DataFrame并合并
循环处理每个组,把日期、数值和固定的标识/国家对应起来,再加上你需要的空列(显示为na),最后合并所有组的结果:
# 用来存储每个组的DataFrame dfs = [] for group in groups: # 提取当前组的各项数据 label = group[0][0] # 比如'A'或'B' country = group[1][0] # 比如'America'或'Britan' dates = group[2] # 日期列表 vals1 = group[3] # 第一组数值 vals2 = group[4] # 第二组数值 # 创建当前组的临时DataFrame temp_df = pd.DataFrame({ 'Label': [label]*len(dates), # 让每个日期行都带上标识 'Country': [country]*len(dates), # 让每个日期行都带上国家 'Date': dates, 'Value1': vals1, 'Value2': vals2, 'Col5': np.nan, # 对应示例中的第一个空值(na) 'Col6': np.nan # 对应示例中的第二个空值(na) }) dfs.append(temp_df) # 合并所有组的DataFrame,得到最终结果 final_df = pd.concat(dfs, ignore_index=True)
步骤4:输出你想要的格式
运行下面的代码,就能得到和你示例一致的输出(空值显示为na,去掉索引):
# 打印结果,设置空值显示为'na',不显示索引 print(final_df.to_string(index=False, na_rep='na'))
运行后输出的结果就是:
Label Country Date Value1 Value2 Col5 Col6 A America 2017-39 10.0 5.0 na na A America 2017-40 6.0 7.0 na na A America 2017-41 6.0 8.0 na na A America 2017-42 6.0 9.0 na na A America 2017-43 1.0 1.0 na na B Britan 2017-38 41.0 40.0 na na B Britan 2017-39 27.0 38.0 na na B Britan 2017-40 38.0 28.0 na na B Britan 2017-41 36.0 27.0 na na B Britan 2017-42 33.0 23.0 na na B Britan 2017-43 41.0 65.0 na na B Britan 2017-44 8.0 4.0 na na
(注:你示例中A组最后一行的Value2写的是10.0,应该是笔误,原始数据里是1.0,所以代码生成的是1.0哦)
内容的提问来源于stack exchange,提问作者Ahamed Moosa
相关产品推荐
相关产品推荐

