我有一個嵌套字典結構串列,如下所示:
{'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 Lamba Time Distribution Equivalent Lambda Average Packet Lambda... Size Distribution...Packet Size 2
這怎么可能?此外,我正在處理的資料并不總是具有相同的Time Distribution Parameters或Size Distribution Parameters. 例如,有時可能會有一個Packet Size 3,但并非總是如此。當Packet Size 3不存在類似的東西時,如何創建其中一些值為空的資料框?
uj5u.com熱心網友回復:
這可能已經在這里有了答案
上面鏈接上的回答說您可以直接向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)
輸出字典
{
"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
uj5u.com熱心網友回復:
pd.json_normalize()允許將嵌套資料展平到Pandas列中。如果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'])
輸出:
| 最大平均蘭巴 | 時間分布 | 尺寸分布 | 等效 Lambda | 平均資料包 Lambda | 指數最大因子 | 平均資料包大小 | 資料包大小 1 | 資料包大小 2 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1278.1 | 指數 | 二項式 | 950.486 | 0.950486 | 10 | 1000 | 300 | 1700 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/353670.html
