使用元组字典(Python)创建表

使用元组字典(Python)创建表,python,pandas,dictionary,dataframe,Python,Pandas,Dictionary,Dataframe,我有带元组键的dict: td=[((1, 1), 1), ((1, 2), 2), ((1, 3), 1) ((2, 1), 1), ((2, 2), 5), ((3, 2), 2] 我想创建如下表:(使用元组作为索引) 如何使用python创建此表 我尝试了pd.MultiIndex,但它不起作用 谢谢 我不认为这里需要多索引 选项1 调用pd.DataFrame前展平。您可以通过*参数解包来概括这一点- pd.DataFrame([list(x) + y for x, *y in td]

我有带元组键的dict:

td=[((1, 1), 1), ((1, 2), 2), ((1, 3), 1) ((2, 1), 1), ((2, 2), 5), ((3, 2), 2]
我想创建如下表:(使用元组作为索引)

如何使用python创建此表

我尝试了pd.MultiIndex,但它不起作用


谢谢

我不认为这里需要
多索引

选项1
调用
pd.DataFrame
前展平。您可以通过
*
参数解包来概括这一点-

pd.DataFrame([list(x) + y for x, *y in td])

   0  1  2
0  1  1  1
1  1  2  2
2  1  3  1
3  2  1  1
4  2  2  5
5  3  2  2

选项2
略为迂回,使用
pd.concat
-

df = pd.DataFrame(td)

        0  1
0  (1, 1)  1
1  (1, 2)  2
2  (1, 3)  1
3  (2, 1)  1
4  (2, 2)  5
5  (3, 2)  2

pd.concat([pd.DataFrame(df.iloc[:, 0].tolist()), df.iloc[:, 1:]], axis=1)

   0  1  1
0  1  1  1
1  1  2  2
2  1  3  1
3  2  1  1
4  2  2  5
5  3  2  2
让我们试试这个:

更正某些数据:

td=[((1, 1), 1), ((1, 2), 2), ((1, 3), 1), ((2, 1), 1), 
    ((2, 2), 5), ((3, 2), 2), ((3, 1), 1)]
展平元组

l = [(i[0],i[1],v) for i,v in td]
lol = [list(e) for e in l]
创建和重塑数据帧

pd.DataFrame(lol).set_index([1,0]).rename_axis([None,None]).unstack()[2]\
  .fillna(0).astype(int)
输出:

   1  2  3
1  1  1  1
2  2  5  2
3  1  0  0
   1   2  3  4  5  6  7  8  9
1  9   0  0  0  0  0  0  0  0
2  0  10  0  0  0  0  0  0  0
3  0   1  0  1  0  0  0  0  0
4  0   0  0  1  0  0  0  0  0
5  0   0  0  0  1  1  0  0  0
6  0   0  0  0  0  1  0  0  0
7  0   0  0  0  0  0  0  0  0
8  0   0  0  0  0  0  0  0  0
9  0   0  0  0  0  0  0  0  0
要展开dataframe,请执行以下操作:

pd.DataFrame(lol).set_index([1,0]).rename_axis([None,None]).unstack()[2]\
  .reindex(index=np.arange(1,10), columns=np.arange(1,10)).fillna(0).astype(int)
输出:

   1  2  3
1  1  1  1
2  2  5  2
3  1  0  0
   1   2  3  4  5  6  7  8  9
1  9   0  0  0  0  0  0  0  0
2  0  10  0  0  0  0  0  0  0
3  0   1  0  1  0  0  0  0  0
4  0   0  0  1  0  0  0  0  0
5  0   0  0  0  1  1  0  0  0
6  0   0  0  0  0  1  0  0  0
7  0   0  0  0  0  0  0  0  0
8  0   0  0  0  0  0  0  0  0
9  0   0  0  0  0  0  0  0  0
我想是这样

pd.Series(dict(td)).reset_index()
Out[115]: 
   level_0  level_1  0
0        1        1  1
1        1        2  2
2        1        3  1
3        2        1  1
4        2        2  5
5        3        1  1
6        3        2  2

你能展示一下你试过的吗?“不工作”是什么意思?
td
是一个元组列表…FTFY标题。刚刚更新了问题以澄清是否需要知道我需要转到9(十列和十行)还是只想选择9?@cᴏʟᴅsᴘᴇᴇᴅ 在什么意义上?数据类型?例如,
td
可以嵌套两个以上的元素。在这种情况下,
(i[0],i[1],v)
将不再工作。@cᴏʟᴅsᴘᴇᴇᴅ 我同意,但元组列表的全部思想是有(行、列)值。第四项或第五项对于创建二维数组没有意义。我不确定你是否理解我。我的意思是说你可以把
((1,2,3),4)
作为一个元素。为什么不呢?在这种情况下,您的代码中需要
(i[0],i[1],i[2],v)
(1,2,3),4不会生成OP所要求的2d数组(我认为这就是他所要求的)。添加一种新方法:-)谢谢温家宝,我有一个简短的问题。我想要固定索引(1到9)。如何为行和列添加固定索引。@JakeHan您可以使用dict和Series检查这部分
reindex(索引=范围(1,10),列=范围(1,10))
@Wen nice+1@ScottBoston谢天谢地,我曾经有一个问题,转换成dict的数据将有多个键,因为他更改了输出,所以使用dict应该是安全的。:-)我回滚了问题并删除了编辑。我不能容忍用户中途编辑他们的问题,并使人们的答案和时间无效。