从dict创建数据框,其中键是元组

Bog*_*anC 12 python pandas

我有以下dict,键为元组:

d = {('first', 'row'): 3, ('second', 'row'): 1}
Run Code Online (Sandbox Code Playgroud)

我想创建一个包含3列的数据框:Col1,Col2和Col3,它们应如下所示:

Col1   Col2  Col3
first  row   3
second row   4
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何拆分元组,而不是按对解析dict对.

ayh*_*han 15

首先构造一个系列,然后重置索引将为您提供一个DataFrame:

pd.Series(d).reset_index()
Out: 
  level_0 level_1  0
0   first     row  3
1  second     row  1
Run Code Online (Sandbox Code Playgroud)

您可以在以后重命名列:

df = pd.Series(d).reset_index()   
df.columns = ['Col1', 'Col2', 'Col3']   
df
Out: 
     Col1 Col2  Col3
0   first  row     3
1  second  row     1
Run Code Online (Sandbox Code Playgroud)

或者在单行中,首先命名MultiIndex:

pd.Series(d).rename_axis(['Col1', 'Col2']).reset_index(name='Col3')
Out[7]: 
     Col1 Col2  Col3
0   first  row     3
1  second  row     1
Run Code Online (Sandbox Code Playgroud)


Max*_*axU 5

不像@ ayhan的解决方案那么优雅:

In [21]: pd.DataFrame(list(d), columns=['Col1','Col2']).assign(Col3=d.values())
Out[21]:
     Col1 Col2  Col3
0   first  row     3
1  second  row     1
Run Code Online (Sandbox Code Playgroud)

或者直截了当:

In [27]: pd.DataFrame([[k[0],k[1],v] for k,v in d.items()]) \
           .rename(columns={0:'Col1',1:'Col2',2:'Col2'})
Out[27]:
     Col1  Col2  Col2
0   first   row     3
1  second   row     1
Run Code Online (Sandbox Code Playgroud)


Jon*_*Jon 5

我很好奇是否可以使用 MultiIndexes,所以我进行了尝试。如果您想指定级别,这可能有其好处。但是只需按照 pandas 文档示例(MultiIdex)我想出了一个替代解决方案。

首先我创建了一个随机数据字典

s = {(1,2):"a", (4,5):"b", (1,5):"w", (2, 3):"z", (4,1):"p"}
Run Code Online (Sandbox Code Playgroud)

然后我曾经pd.MultiIndex从字典的键创建一个分层索引。

index = pd.MultiIndex.from_tuples(s.keys())


index
Out[3]: 
MultiIndex(levels=[[1, 2, 4], [1, 2, 3, 5]],
        labels=[[0, 2, 2, 1, 0], [1, 3, 0, 2, 3]])
Run Code Online (Sandbox Code Playgroud)

然后,我将字典的值直接传递给 pandas Series,并将索引显式设置为我在上面创建的 MultiIndex 对象。

pd.Series(s.values(), index=index)
Out[4]: 
1  2    a
4  5    b
   1    p
2  3    z
1  5    w
dtype: object
Run Code Online (Sandbox Code Playgroud)

最后,我重置索引以获得OP要求的解决方案

pd.Series(s.values(), index=index).reset_index()
Out[5]: 
level_0  level_1  0
0        1        2  a
1        4        5  b
2        4        1  p
3        2        3  z
4        1        5  w
Run Code Online (Sandbox Code Playgroud)

这有点复杂,所以@ayhan 的答案可能仍然更可取,但我认为这可以让您了解大熊猫在后台可能会做什么。或者至少让任何人有机会更多地修改熊猫的机制。