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

如何用Pandas将字典列表转换为双层键字典?

用Pandas实现字典列表到嵌套字典的转换

原始数据

日志数据列表

list1 =[
{'ip': '11.22.33.44', 'timestamp': 1665480231699, 'message': '{"body": "Idle time larger than time period. retry:0"}', 'ingestionTime': 1665480263198},
{'ip': '11.22.33.42', 'timestamp': 1665480231698, 'message': '{"body": "Idle time larger than time period. retry:5"}', 'ingestionTime': 1665480263198}, 
{'ip': '11.22.33.44', 'timestamp': 1665480231698, 'message': '{"body": "Idle time larger than time period. retry:0"}', 'ingestionTime': 1665480263198}
]

白名单元数据

whitelist_metadata = [
  {
    'LogLevel': 'WARNING',
    'SpecificVersion': 'None',
    'TimeInterval(Min)': 1,
    'MetricMsg': 'DDR: XXXX count got lost',
    'AllowedOccurrenceInTimeInterval': 0   # 表示始终允许该消息
  },
  {
    'LogLevel': 'WARNING',
    'SpecificVersion': 'None',
    'TimeInterval(Min)': 1,
    'MetricMsg': 'Idle time larger than XXX time. retry: \\d ',
    'AllowedOccurrenceInTimeInterval': 5  # 表示1分钟内出现次数不超5次才允许
  }
]

预期输出

{
  '11.22.33.42': {
    1665480231698: ['{"body": "Idle time larger than time period. retry:5"}']
  },
  '11.22.33.44': {
    1665480231698: ['{"body": "Idle time larger than time period. retry:0"}'],
    1665480231699: ['{"body": "Idle time larger than time period. retry:0"}']
  }
}

错误尝试代码

df = pd.DataFrame(list1)
s = df.pivot(['ip', 'timestamp'], 'message')   
ss = s.assign(r=s.to_dict('records'))['r'].unstack(0).to_dict() 

正确实现方法

方法一:利用多级索引层级转换

通过groupby聚合后,调整索引层级直接生成嵌套字典:

import pandas as pd

df = pd.DataFrame(list1)

# 按ip和timestamp分组,将message聚合为列表
grouped = df.groupby(['ip', 'timestamp'])['message'].agg(list)

# 转换为嵌套字典结构
result = {}
for ip in grouped.index.get_level_values(0).unique():
    result[ip] = grouped.loc[ip].to_dict()

print(result)

方法二:双层分组遍历(逻辑更直观)

先按IP分组,再对每个IP内的日志按时间戳聚合:

import pandas as pd

df = pd.DataFrame(list1)

final_result = {}
# 外层按IP分组
for ip, ip_group in df.groupby('ip'):
    # 内层按timestamp分组,聚合message为列表并转字典
    final_result[ip] = ip_group.groupby('timestamp')['message'].agg(list).to_dict()

print(final_result)

两种方法都能直接生成符合预期的嵌套字典结构,其中方法二的逻辑更易理解,适合后续扩展维护。

内容的提问来源于stack exchange,提问作者Shani Smadja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:50:23