我有一个字典,它需要多索引,如下所示:
dict = {'Main1' : {'A1' : {'a1' : 0},
'A2' : {'a2' : 15},
'A3' : {'a3' : 22},
'A4' : {'a4' : 130}},
'Main2' : {'B1' : {'b1' : 150},
'B2' : {'b2' : 30},
'B3' : {'b3' : 1}}}
我想将它作为像这样的pandas DataFrame导入Python:
col1 col2 col3 col4
Main 1 A1 a1 0
Main 1 A2 a2 15
Main 1 A3 a3 22
Main 1 A4 a4 130
Main 2 B1 b1 150
Main 2 B2 b2 30
Main 2 B3 b3 1
这是否可能,或者我应该尝试找到另一种方法来导入我的数据?
答案 0 :(得分:3)
你可以这样做:
df = pd.DataFrame([(k1, k2, k3, v) for k1, k23v in dict.items()
for k2, k3v in k23v.items()
for k3, v in k3v.items()
])
df.columns = ['Col1', 'Col2', 'Col3', 'Col4']
输出:
Col1 Col2 Col3 Col4
0 Main1 A1 a1 0
1 Main1 A3 a3 22
2 Main1 A2 a2 15
3 Main1 A4 a4 130
4 Main2 B1 b1 150
5 Main2 B2 b2 30
6 Main2 B3 b3 1
答案 1 :(得分:1)
这是使用pd.DataFrame.from_dict
的一种方式:
d = {'Main1' : {'A1' : {'a1' : 0},
'A2' : {'a2' : 15},
'A3' : {'a3' : 22},
'A4' : {'a4' : 130}},
'Main2' : {'B1' : {'b1' : 150},
'B2' : {'b2' : 30},
'B3' : {'b3' : 1}}}
# restructure dictionary to dictionary of tuple keys -> values
d2 = {(i, j, k): d[i][j][k] for i in d.keys()
for j in d[i].keys()
for k in d[i][j].keys()}
# construct dataframe from dictionary
df = pd.DataFrame.from_dict(d2, orient='index').reset_index()
# split column of tuples to multiple columns
df[['col1', 'col2', 'col3']] = df['index'].apply(pd.Series)
# clean up: remove unwanted columns, rename and sort
df = df.drop('index', 1)\
.rename(columns={0: 'col4'})\
.sort_index(axis=1)
print(df)
col1 col2 col3 col4
0 Main1 A1 a1 0
1 Main1 A2 a2 15
2 Main1 A3 a3 22
3 Main1 A4 a4 130
4 Main2 B1 b1 150
5 Main2 B2 b2 30
6 Main2 B3 b3 1
答案 2 :(得分:0)
我发现这样做的另一种方法是制作数据帧的字典,concat
将它们全部放在一起,然后unstack
,然后删除NaN
值
dataframes = {k: pd.DataFrame(v) for k,v in d.items()}
dataframe = pd.concat(dataframes, axis=1)
output = dataframe.unstack().dropna()
输出:
Main1 A1 a1 0.0
A2 a2 15.0
A3 a3 22.0
A4 a4 130.0
Main2 B1 b1 150.0
B2 b2 30.0
B3 b3 1.0
dtype: float64