从含列表的字典创建单行DataFrame的相关技术疑问
Pandas DataFrame构造相关问题
先看原始代码及输出:
import pandas as pd my_list = [1,2,3] year = 2023 item = 'obj' res_dict = {"year" : year, "values" : my_list, "name" : item } print(res_dict) # 输出: {'year': 2023, 'values': [1, 2, 3], 'name': 'obj'} df = pd.DataFrame(res_dict) print(df) # 输出: # year values name # 0 2023 1 obj # 1 2023 2 obj # 2 2023 3 obj
我需要生成两种不同的DataFrame,先说明第一种需求:希望在values列的单元格中直接存储列表,得到如下结果:
year values name 0 2023 [1, 2, 3] obj
疑问一:在DataFrame单元格中存储列表是否合理?
这种方式并非完全不能实现,但通常不推荐,原因如下:
- 违背了DataFrame的结构化设计初衷:DataFrame的核心是处理标量类型的结构化数据,每一列应存储同类型的单个值,这样才能充分利用Pandas的向量化运算、索引、聚合等高效功能。
- 后续处理成本极高:筛选、统计、可视化等操作都需要额外遍历单元格内的列表,无法直接调用Pandas内置方法,效率极低。
- 数据持久化容易出问题:保存为CSV、Excel等格式时,列表会被转为字符串存储,读取后需要额外解析,很容易出现格式错误。
- 如果确实需要存储嵌套数据,更建议用JSON这类专门的嵌套格式,或者直接把数据拆分为结构化形式。
疑问二:如何将列表元素拆分为单独列,得到如下DataFrame?
目标结果:
year values1 values2 values3 name 0 2023 1 2 3 obj
可以通过以下几种方式实现:
方法1:拆分列表为单独列后合并
import pandas as pd my_list = [1,2,3] year = 2023 item = 'obj' # 将列表转为带命名列的DataFrame values_df = pd.DataFrame([my_list], columns=[f'values{i+1}' for i in range(len(my_list))]) # 构造其他字段的DataFrame other_df = pd.DataFrame({'year': [year], 'name': [item]}) # 横向合并两个DataFrame final_df = pd.concat([other_df, values_df], axis=1) print(final_df)
方法2:直接构造拆分后列的字典
import pandas as pd my_list = [1,2,3] year = 2023 item = 'obj' # 构造包含所有拆分列的字典 res_dict = { 'year': [year], **{f'values{i+1}': [val] for i, val in enumerate(my_list)}, 'name': [item] } final_df = pd.DataFrame(res_dict) print(final_df)
方法3:先存列表再拆分列
import pandas as pd my_list = [1,2,3] year = 2023 item = 'obj' # 先构造存储列表的单行DataFrame temp_df = pd.DataFrame({'year': [year], 'values': [my_list], 'name': [item]}) # 拆分values列并重命名 values_split = temp_df['values'].apply(pd.Series).rename(columns=lambda x: f'values{x+1}') # 合并并删除原values列 final_df = pd.concat([temp_df.drop('values', axis=1), values_split], axis=1) print(final_df)
内容的提问来源于stack exchange,提问作者Paul Zakharov
相关产品推荐
相关产品推荐

