将嵌套字典结构转换为Pandas数据帧



我有一个嵌套字典结构列表,如下所示:

{'1278.1': 
{'Time Distribution': 'Exponential', 
'Time Distribution Parameters': {'Equivalent Lambda': 950.486, 'Average Packet Lambda': 0.950486, 'Exponential Max Factor': 10.0}, 
'Size Distribution': 'Binomial', x
'Size Distribution Parameters': {'Average Packet Size': 1000.0, 'Packet Size 1': 300.0, 'Packet Size 2': 1700.0}}}

第一个数值(此处显示为'1278.1'(被称为max avg lambda值。我想创建一个用以下列格式化的数据帧:

Max Avg LambaTime DistributionEquivalent LambdaAverage Packet Lambda。。。Size Distribution。。。Packet Size 2

这怎么可能?此外,我正在处理的数据并不总是具有相同的Time Distribution ParametersSize Distribution Parameters。例如,有时可能存在Packet Size 3,但并非总是如此。当不存在类似Packet Size 3的内容时,如何创建其中一些值为空的数据帧?

pd.json_normalize((允许将嵌套数据展平为panda列。如果Packet Size 3在某些行中可用,但在其他行中不可用,则缺失的值将表示为np.nan。一个可能的工作流程是:

import pandas as pd
data = {'1278.1': {'Time Distribution': 'Exponential', 'Time Distribution Parameters': {'Equivalent Lambda': 950.486, 'Average Packet Lambda': 0.950486, 'Exponential Max Factor': 10.0}, 'Size Distribution': 'Binomial', 'Size Distribution Parameters': {'Average Packet Size': 1000.0, 'Packet Size 1': 300.0, 'Packet Size 2': 1700.0}}}
#read dataframe with Max Avg Lamba as index, then reset index to column
df = pd.DataFrame.from_dict(data,orient='index').reset_index().rename(columns={'index': 'Max Avg Lamba'})
#flatten Time Distribution Parameters and Size Distribution Parameters, join with dataframe
df = df.join(pd.json_normalize(df['Time Distribution Parameters']))
df = df.join(pd.json_normalize(df['Size Distribution Parameters']))
#remove redundant columns
df = df.drop(columns=['Time Distribution Parameters', 'Size Distribution Parameters'])

输出:

项式>>1700
指数最大因子平均数据包大小
01278.1指数950.4860.95048610>1000300

这里可能已经有了答案

上面链接上的答案是,你可以直接向pd.DataFrame函数输入字典,它会吐出输入字典的数据帧。

下面的代码应该正确地格式化上面的dict,并将其更改为允许DataFrame方法正确读取它的格式。

import copy
import pandas as pd
d = {
"1278.1": {"Time Distribution": "Exponential", 
"Time Distribution Parameters": {"Equivalent Lambda": 950.486, "Average Packet Lambda": 0.950486, "Exponential Max Factor": 10.0
}, 
"Size Distribution": "Binomial",
"Size Distribution Parameters": {"Average Packet Size": 1000.0, "Packet Size 1": 300.0, "Packet Size 2": 1700.0
}
}
}
# Convert to list to get keys(max avg lambdas)
max_avg_lambdas = list(d)
list_of_dicts = []
# If there are more than 1 keys iterate and create new dict
for max_avg_lambda in max_avg_lambdas:
# Create new key/value pair of the max avg lambda inside of Time dist parameters
d[max_avg_lambda]["Time Distribution Parameters"]["Max Avg Lambda"] = max_avg_lambda
# Create a new dict with contents of max_avg_lambda key dict
fixed_dict = copy.deepcopy(d[max_avg_lambda])
# Append dict to a list of dicts
list_of_dicts.append(fixed_dict)
for info_dict in list_of_dicts:
df = pd.DataFrame(info_dict)
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
print(df)
print(fixed_dict)

输出dict

{
"Time Distribution": "Exponential",
"Time Distribution Parameters": {
"Max Avg Lambda": "1278.1",
"Equivalent Lambda": 950.486,
"Average Packet Lambda": 0.950486,
"Exponential Max Factor": 10.0
},
"Size Distribution": "Binomial",
"Size Distribution Parameters": {
"Average Packet Size": 1000.0,
"Packet Size 1": 300.0,
"Packet Size 2": 1700.0
}
}

输出:

Time Distribution Time Distribution Parameters  
Equivalent Lambda            Exponential                      950.486   
Average Packet Lambda        Exponential                     0.950486   
Exponential Max Factor       Exponential                         10.0   
Max Avg Lambda               Exponential                       1278.1   
Average Packet Size          Exponential                          NaN   
Packet Size 1                Exponential                          NaN   
Packet Size 2                Exponential                          NaN   
Size Distribution  Size Distribution Parameters  
Equivalent Lambda               Binomial                           NaN  
Average Packet Lambda           Binomial                           NaN  
Exponential Max Factor          Binomial                           NaN  
Max Avg Lambda                  Binomial                           NaN  
Average Packet Size             Binomial                        1000.0  
Packet Size 1                   Binomial                         300.0  
Packet Size 2                   Binomial                        1700.0 

相关内容

最新更新