如何在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
相关产品推荐
相关产品推荐

