DataFrame.from_dict无法使用元组键将dict更改为多索引数据框

时间:2018-11-09 02:56:26

标签: python pandas

我对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如何工作以导致这些结果?

2 个答案:

答案 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

让我知道是否可以进一步解释。