使用元组字典(Python)创建表
我有带元组键的dict:使用元组字典(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]
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应该是安全的。:-)我回滚了问题并删除了编辑。我不能容忍用户中途编辑他们的问题,并使人们的答案和时间无效。