我对DataFrame.from_dict非常困惑。似乎DataFrame.from_dict偶然对@元组dict的dict起作用了。认真地,我在下面尝试了一些案例。
案例1:
dict_var1 = {('a', 'b'): [43,47], ('a', 'c'): [23,40], ('b', 'c'): [30,35], ('c', 'd'): [10,30], ('a', 'd'): [23,28]}
frame_var1 = pd.DataFrame.from_dict(dict_var1, orient='index', columns=['num', 'cnt'])
print(frame_var1.index)
结果1:
索引([[('a','b'),('a','c'),('b','c'),('c','d'),('a' ,'d')],dtype ='object')
案例2:
dict_var2 = {('a', 'b'): {'num': 43, 'cnt': 47}, ('a', 'c'): {'num': 23, 'cnt': 40}, ('b', 'c'): {'num': 30, 'cnt': 35}, ('c', 'd'): {'num': 10, 'cnt': 30}, ('a', 'd'): {'num': 23, 'cnt': 28}}
frame_var2 = pd.DataFrame.from_dict(dict_var2, orient='index', columns=['num', 'cnt'])
print(frame_var2.index)
结果2:
MultiIndex(levels = [['a','b','c'],['b','c','d']], 标签= [[0,0,0,1,2],[0,1,2,1,2]])
问题:
当我将dict值的类型从列表更改为dict时,DataFrame.from_dict可以将元组dict键更改为多索引右键。谁能解释一下DataFrame.from_dict如何工作以导致这些结果?
答案 0 :(得分:2)
基于document
if orient == 'index': if len(data) > 0: # TODO speed up Series case if isinstance(list(data.values())[0], (Series, dict)): data = _from_nested_dict(data) else: data, index = list(data.values()), list(data.keys())
因此,在您的情况下,第二个通过isinstance
,则将
data = _from_nested_dict(data)
但是第一个值类型是list,然后是
data, index = list(data.values()), list(data.keys())
答案 1 :(得分:1)
这不是100%的答案,而只是表明您可以像dict_var1
一样使它与dict_var2
一起使用。
其原因是实现细节。但是,如果您以圆柱形式展示pd.DataFrame
(或pd.DataFrame.from_dict(..., orient='columns')
),似乎会更喜欢dict_var1
:
frame_var1 = pd.DataFrame(dict_var1, index=['num', 'cnt']).T
print(frame_var1)
num cnt
a b 43 47
c 23 40
b c 30 35
c d 10 30
a d 23 28
与此相反,pd.DataFrame.from_dict(..., orient='index')
偏爱dict_var2
,并以键作为索引。
frame_var2 = pd.DataFrame.from_dict(
dict_var2, orient='index', columns=['num', 'cnt'])
print(frame_var2)
num cnt
a b 43 47
c 23 40
d 23 28
b c 30 35
c d 10 30
让我知道是否可以进一步解释。