如何将含字典列表的字典转换为带顶级键列的DataFrame
把股票字典转换为带
tick列的DataFrame 下面提供三种实用方法,都能将你给出的字典结构转换成目标格式的DataFrame:
方法1:逐个处理后合并(直观易懂)
对每个股票代码,先把对应的数据列表转成临时DataFrame,添加tick列后,再合并所有临时表。
import pandas as pd import random # 生成你提供的示例数据 ticks = ['NVDA', 'MSFT', 'AAPL'] data = {} for s in ticks: data[s] = [] for _ in range(5): entry = { 'open': round(random.uniform(100, 250), 2), 'high': round(random.uniform(100, 250), 2), 'low': round(random.uniform(100, 250), 2), 'close': round(random.uniform(100, 250), 2) } data[s].append(entry) # 转换为目标DataFrame temp_dfs = [] for tick, daily_data in data.items(): df_temp = pd.DataFrame(daily_data) df_temp['tick'] = tick temp_dfs.append(df_temp) # 合并并重置索引,调整列顺序 final_df = pd.concat(temp_dfs, ignore_index=True) final_df = final_df[['tick', 'open', 'high', 'low', 'close']] print(final_df)
方法2:用explode快速展开(简洁高效)
先把字典转成包含列表的DataFrame,再展开列表并拆分字典列,一步到位。
import pandas as pd import random # 生成示例数据 ticks = ['NVDA', 'MSFT', 'AAPL'] data = {} for s in ticks: data[s] = [] for _ in range(5): entry = { 'open': round(random.uniform(100, 250), 2), 'high': round(random.uniform(100, 250), 2), 'low': round(random.uniform(100, 250), 2), 'close': round(random.uniform(100, 250), 2) } data[s].append(entry) # 转换步骤 df = pd.DataFrame.from_dict(data, orient='index', columns=['daily_data']).reset_index(names='tick') df = df.explode('daily_data') final_df = pd.concat([df['tick'], df['daily_data'].apply(pd.Series)], axis=1) print(final_df)
方法3:手动构建数据列表(无依赖高级API)
先把所有数据整理成统一的字典列表,再直接转成DataFrame,适合对pandas不熟悉的场景。
import pandas as pd import random # 生成示例数据 ticks = ['NVDA', 'MSFT', 'AAPL'] data = {} for s in ticks: data[s] = [] for _ in range(5): entry = { 'open': round(random.uniform(100, 250), 2), 'high': round(random.uniform(100, 250), 2), 'low': round(random.uniform(100, 250), 2), 'close': round(random.uniform(100, 250), 2) } data[s].append(entry) # 手动构建完整数据列表 full_data = [] for tick, daily_entries in data.items(): for entry in daily_entries: full_data.append({'tick': tick, **entry}) final_df = pd.DataFrame(full_data) print(final_df)
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

