如何使用Pandas展开asks与bids列并设置前缀?
使用Pandas展开嵌套字典列表列并添加前缀
这是个很常见的嵌套数据处理需求,结合Pandas的explode和json_normalize工具就能完美解决,同时还能自动处理数据数量不一致时的NaN填充问题。下面是针对你需求的具体实现步骤:
步骤1:导入依赖并准备数据
首先确保你已经导入了Pandas,假设你的原始DataFrame命名为df:
import pandas as pd # 这里用你提供的示例数据片段初始化df(如果已有数据可跳过) data = { 'time': {0: '2022-05-07T00:00:00.000000000Z', 1: '2022-05-07T01:00:00.000000000Z', 2: '2022-05-07T02:00:00.000000000Z', 3: '2022-05-07T03:00:00.000000000Z', 4: '2022-05-07T04:00:00.000000000Z'}, 'asks': {0: [{'price': '0.9999', 'size': '4220492'}, {'price': '1', 'size': '2556759'}, {'price': '1.0001', 'size': '941039'}, {'price': '1.0002', 'size': '458602'}, {'price': '1.0003', 'size': '257955'}], # 其他行的asks/bids数据可补充在此处 }, 'bids': {0: [{'price': '1.0', 'size': '23142'}, {'price': '0.99', 'size': '6436'}], # 其他行的bids数据可补充在此处 } } df = pd.DataFrame(data)
步骤2:分别处理asks和bids列
我们需要把每个列里的字典列表拆分成单独行,再将字典展开为带前缀的列:
# 处理asks列:拆分行 + 展开字典 + 添加前缀 asks_processed = df.explode('asks').reset_index(drop=True) asks_processed = pd.concat( [asks_processed[['time']], pd.json_normalize(asks_processed['asks']).add_prefix('asks_')], axis=1 ) # 处理bids列:同样的逻辑 bids_processed = df.explode('bids').reset_index(drop=True) bids_processed = pd.concat( [bids_processed[['time']], pd.json_normalize(bids_processed['bids']).add_prefix('bids_')], axis=1 )
这里的关键函数说明:
explode('asks'):将每个单元格中的列表拆分为单独的行,原始的time值会自动重复对应每个列表元素pd.json_normalize():把字典格式的数据展开为标准的列结构add_prefix():给展开后的列名添加前缀,避免price/size列名冲突
步骤3:合并结果并处理缺失值
由于同一时间下asks和bids的元素数量可能不一致(比如你示例中最后一行只有1个bids项),我们需要用外连接来合并两个处理后的DataFrame,自动填充缺失值为NaN:
# 按time进行外连接,保留所有行 final_result = pd.merge(asks_processed, bids_processed, on='time', how='outer') # 按时间排序,保证结果顺序和原始数据一致 final_result = final_result.sort_values('time').reset_index(drop=True)
最终效果
运行上述代码后,你就能得到和示例完全一致的结果:
- 每个字典的
price和size分别变成asks_price/asks_size、bids_price/bids_size - 同一时间下的所有asks和bids项都会对应展示
- 数据数量不匹配时,缺失的字段会自动填充为NaN
内容的提问来源于stack exchange,提问作者MathMan 99
相关产品推荐
相关产品推荐

