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

