如何在Pandas DataFrame中展开行内字典并按账号拆分多行
解决Pandas DataFrame字典列拆分多行并保留对应值的问题
我来帮你搞定这个需求!针对你这种每个列都是字典、需要拆分成多行并保留对应账号值的场景,我们可以通过几个Pandas的操作组合来实现,步骤清晰且高效。
第一步:构造示例数据(模拟你的场景)
首先我们先创建一个和你描述一致的DataFrame,甚至加入了单账号、多账号的边界情况:
import pandas as pd data = { 'id': [1,2,3,4], 'column_name_1': [{'acct_nr_1': 'val1_1', 'acct_nr_2': 'val1_2'}, {'acct_nr_1': 'val2_1', 'acct_nr_2': 'val2_2'}, {'acct_nr_1': 'val3_1', 'acct_nr_2': 'val3_2', 'acct_nr_3': 'val3_3'}, {'acct_nr_1': 'val4_1'}], 'column_name_2': [{'acct_nr_1': 'valA_1', 'acct_nr_2': 'valA_2'}, {'acct_nr_1': 'valB_1', 'acct_nr_2': 'valB_2'}, {'acct_nr_1': 'valC_1', 'acct_nr_2': 'valC_2', 'acct_nr_3': 'valC_3'}, {'acct_nr_1': 'valD_1'}], 'column_name_3': [{'acct_nr_1': 'valX_1', 'acct_nr_2': 'valX_2'}, {'acct_nr_1': 'valY_1', 'acct_nr_2': 'valY_2'}, {'acct_nr_1': 'valZ_1', 'acct_nr_2': 'valZ_2', 'acct_nr_3': 'valZ_3'}, {'acct_nr_1': 'valW_1'}] } df = pd.DataFrame(data)
第二步:提取每行的所有账号名称
我们需要先把每一行里所有字典的账号名称提取出来,合并成一个无重复的列表:
# 遍历每行,合并所有列字典的键(账号)并去重 df['account_number'] = df.apply( lambda row: list(set().union(*[d.keys() for d in row[['column_name_1', 'column_name_2', 'column_name_3']]])), axis=1 )
第三步:将账号列表拆分为多行
用explode方法把每个账号拆成单独的行,同时保留原id和其他列的字典数据:
df_exploded = df.explode('account_number').reset_index(drop=True)
第四步:提取每个列对应账号的值
遍历所有原数据列,根据account_number取出对应字典里的数值:
# 为每个原列提取对应账号的值 for col in ['column_name_1', 'column_name_2', 'column_name_3']: df_exploded[col] = df_exploded.apply( lambda row: row[col].get(row['account_number'], None), # 容错:如果字典没有该账号则返回None axis=1 ) # 调整列顺序,让结构更符合你的需求 df_final = df_exploded[['id', 'account_number', 'column_name_1', 'column_name_2', 'column_name_3']]
特殊情况处理:如果字典是字符串格式
如果你的DataFrame里的字典其实是字符串(比如"{acct_nr_1: value}"这种形式),需要先把它转换成真正的Python字典,只需要在最开始加一步:
import ast # 将字符串格式的字典转为Python字典 for col in ['column_name_1', 'column_name_2', 'column_name_3']: df[col] = df[col].apply(ast.literal_eval)
运行完上面的代码后,你就能得到完全符合预期的DataFrame啦!
内容的提问来源于stack exchange,提问作者AldanaBRZ
相关产品推荐
相关产品推荐

