我有一个字典,其中包含2个级别的键,第二个级别的值是数据帧:
my_dict = {
'elem1':{'day1': pd.DataFrame(columns=['Col1', 'Col2']),
'day2': pd.DataFrame(columns=['Col1', 'Col2'])
},
'elem2':{'day1': pd.DataFrame(columns=['Col1', 'Col2']),
'day2': pd.DataFrame(columns=['Col1', 'Col2'])
'day3': pd.DataFrame(columns=['Col1', 'Col2'])
}
}
如何将其转换为以下形式的多索引熊猫数据框:
Col1 Col2
elem1 day1 ... ...
day2 ... ...
elem2 day1 ... ...
day2 ... ...
我已经仔细阅读了以下答案,但无法找到解决方案:
答案 0 :(得分:2)
想法通过两个键创建元组并传递到concat
,MultiIndex
的第三级是从原始DataFrame
的索引值创建的,如有必要,您可以将其删除:>
my_dict = {
'elem1':{'day1': pd.DataFrame(1, columns=['Col1', 'Col2'], index=[1,2]),
'day2': pd.DataFrame(2, columns=['Col1', 'Col2'], index=[1,2])
},
'elem2':{'day1': pd.DataFrame(3, columns=['Col1', 'Col2'], index=[1,2]),
'day2': pd.DataFrame(4, columns=['Col1', 'Col2'], index=[1,2]),
'day3': pd.DataFrame(5, columns=['Col1', 'Col2'], index=[1,2])
}
}
d = {(k1, k2): v2 for k1, v1 in my_dict.items() for k2, v2 in v1.items()}
print (d)
{('elem1', 'day1'): Col1 Col2
1 1 1
2 1 1, ('elem1', 'day2'): Col1 Col2
1 2 2
2 2 2, ('elem2', 'day1'): Col1 Col2
1 3 3
2 3 3, ('elem2', 'day2'): Col1 Col2
1 4 4
2 4 4, ('elem2', 'day3'): Col1 Col2
1 5 5
2 5 5}
df = pd.concat(d, sort=False)
print (df)
Col1 Col2
elem1 day1 1 1 1
2 1 1
day2 1 2 2
2 2 2
elem2 day1 1 3 3
2 3 3
day2 1 4 4
2 4 4
day3 1 5 5
2 5 5
df = pd.concat(d, sort=False).reset_index(level=2, drop=True)
print (df)
Col1 Col2
elem1 day1 1 1
day1 1 1
day2 2 2
day2 2 2
elem2 day1 3 3
day1 3 3
day2 4 4
day2 4 4
day3 5 5
day3 5 5
答案 1 :(得分:1)
尝试这样:
my_dict = {
'elem1':{'day1': pd.DataFrame(columns=['Col1', 'Col2']),
'day2': pd.DataFrame(columns=['Col1', 'Col2'])
},
'elem2':{'day1': pd.DataFrame(columns=['Col1', 'Col2']),
'day2': pd.DataFrame(columns=['Col1', 'Col2'])
'day3': pd.DataFrame(columns=['Col1', 'Col2'])
}
}
nd = {}
for x in my_dict:
nd.update(my_dict[x])
df = pd.DataFrame(nd,index=my_dict.keys())