如何在Pandas中展开列内嵌套字典列表 生成符合要求的DataFrame
实现方案
我们可以通过拆分列表+序列化字典两个步骤完成嵌套结构展开,完整代码如下:
import pandas as pd # 你的原始数据 fear_speech_data = {'message_text': '*प्रशासक समिति*', 'translated_text': '* Administrator ', 'annotation_list': ['Fear speech', 'Fear speech', 'Normal'], 'propagation': [{'group_id': 9087, 'user_id': 229869, 'timestamp': 1538130086000}, {'group_id': 7, 'user_id': 215, 'timestamp': 1550186113000}]} # 第一步:生成初始DataFrame,将单条数据包裹为列表避免按行转置 df = pd.DataFrame([fear_speech_data]) # 第二步:拆分propagation列表为单独的列,2个元素对应2个列名,元素数量变化可对应调整列名数量 df[['prop_1', 'prop_2']] = pd.DataFrame(df['propagation'].tolist(), index=df.index) # 第三步:展开每一个嵌套字典的字段 # 不需要区分传播链路、保留重复列名用这段: prop1_df = pd.json_normalize(df['prop_1']) prop2_df = pd.json_normalize(df['prop_2']) # 需要区分不同链路避免重复列名异常,把上面两行替换为下面这段即可: # prop1_df = pd.json_normalize(df['prop_1']).add_suffix('_1') # prop2_df = pd.json_normalize(df['prop_2']).add_suffix('_2') # 第四步:合并所有列得到最终结果 final_df = pd.concat([df.drop(['prop_1', 'prop_2'], axis=1), prop1_df, prop2_df], axis=1)
通用适配写法(适用于propagation字典数量不固定的场景)
如果数据中propagation字段包含的字典数量不统一,可以用以下代码自动适配:
# 自动拆分所有propagation元素 prop_df = pd.DataFrame(df['propagation'].tolist(), index=df.index) expanded_props = [] for col in prop_df.columns: expanded = pd.json_normalize(prop_df[col]) # 需要后缀区分就取消注释下一行 # expanded = expanded.add_suffix(f'_{col+1}') expanded_props.append(expanded) # 合并得到最终结果 final_df = pd.concat([df] + expanded_props, axis=1)
内容的提问来源于stack exchange,提问作者Alex Kujur
相关产品推荐
相关产品推荐

