You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中提取Data列的b_id与incentive值并重组数据

提取DataFrame嵌套字典列表的指定字段

原始数据

原始DataFrame结构如下:

Call    Data
1   [{'b_id': '31358658', 'incentive': 0}, {'b_id': 'D8384E90', 'incentive': 0}, {'b_id': '681B405A','incentive': 100}]
2   [{'b_id': 'D8384E90','incentive': 0 }, {'b_id': '31358658',  'incentive': 0}, {'b_id': '681B405A', 'incentive': 120}]
3   [{'b_id': '971C0B58','incentive': 0,}]
4   [{'b_id': '00450AAA','incentive': 0}, {'b_id': '0BCAEC4F','incentive': 0}, {'b_id': 'F2AD1313''incentive': 220},{'b_id': '971C0B58', 'incentive': 0}]

示例数据生成代码:

# sample data code 
Call = [1,2,3,4,5,6,7,8,9]
Data= [
    [{'b_id': '31358658', 'incentive': 0}, {'b_id': 'D8384E90', 'incentive': 0}, {'b_id': '681B405A','incentive': 100}],
    [{'b_id': 'D8384E90','incentive': 0 }, {'b_id': '31358658',  'incentive': 0}, {'b_id': '681B405A', 'incentive': 120}],
    [{'b_id': '971C0B58','incentive': 0}],
    [{'b_id': '00450AAA','incentive': 0}, {'b_id': '0BCAEC4F','incentive': 0}, {'b_id': 'F2AD1313','incentive': 220},{'b_id': '971C0B58', 'incentive': 0}],
    [{'b_id': '90591CC5','incentive': 0}, {'b_id': '31358658','incentive': 0,}],
    [{'b_id': '20E32751', 'incentive': 0}, {'b_id': '339A574F','incentive': 0}],
    [{'b_id': '971C0B58','incentive': 0}],
    [],
]
df = pd.DataFrame(list(zip(Call,Data)), columns =['Call','Data'])

期望输出

需将Data列拆分为B_id和incentive两列,每列对应原始列表中字典的对应值组成的列表:

Call    B_id                                    incentive
1       [31358658,D8384E90,681B405A]            [0,0,100]
2       [D8384E90,31358658,681B405A]            [0,0,120]
3       [971C0B58]                              [0]
4       [00450AAA,0BCAEC4F,F2AD1313,971C0B58]   [0,0,220,0]

当前尝试代码

用户尝试通过字符串分割处理,但未达到预期效果:

df1 = df1.join(df1['Data'].str.split('b_id',expand=True).add_prefix('data'))

解决方案

无需通过字符串搜索提取,直接针对嵌套字典列表遍历取值即可,用apply结合列表推导式实现:

# 提取b_id列表
df['B_id'] = df['Data'].apply(lambda x: [d.get('b_id') for d in x if d])
# 提取incentive列表
df['incentive'] = df['Data'].apply(lambda x: [d.get('incentive') for d in x if d])
# 保留目标列
df_final = df[['Call', 'B_id', 'incentive']]

代码说明

  • lambda x遍历Data列的每个元素(即字典列表)
  • d.get('b_id')安全获取字典中的目标值,避免键不存在报错
  • if d过滤空字典,兼容原始数据中的空元素
  • 最后筛选出需要的三列即可得到目标格式,同时兼容Data列长度不固定的场景

内容的提问来源于stack exchange,提问作者Aniruddha Das

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:50:35