Python嵌套字典中的内部值无明确原因地更改
我试图创建一个嵌套字典,该字典由一个数据帧中的两列索引,但每次向内部字典添加一个新键时,内部值都会更改Python嵌套字典中的内部值无明确原因地更改,python,pandas,dictionary,nested,Python,Pandas,Dictionary,Nested,我试图创建一个嵌套字典,该字典由一个数据帧中的两列索引,但每次向内部字典添加一个新键时,内部值都会更改 df.pivot_table(index='label',columns='concept',values='value').to_dict() 我的意图是创建一个字典,其键是一个dataframe列中的值,其值是具有另一列键的字典,其中内部字典的值来自第三列。我从嵌套字典的空白结构开始,遍历dataframe的行,并相应地更新字典值 (我将演示我的意思以及我用虚拟值尝试过的内容。) 将熊猫
df.pivot_table(index='label',columns='concept',values='value').to_dict()
我的意图是创建一个字典,其键是一个dataframe列中的值,其值是具有另一列键的字典,其中内部字典的值来自第三列。我从嵌套字典的空白结构开始,遍历dataframe的行,并相应地更新字典值
(我将演示我的意思以及我用虚拟值尝试过的内容。)
将熊猫作为pd导入
df=pd.DataFrame({'label':['a1','a1','a1','a1','a2','a2','a2','a2'],
‘概念’:[‘b1’、‘b2’、‘b3’、‘b4’、‘b1’、‘b2’、‘b3’、‘b4’],
“值”:[1,0.5,0.2,0.7,0.6,0.4,0.8,0.7]})
结果=dict.fromkeys(df['b'].unique(),dict.fromkeys(df['a'].unique(),0))
对于i,df.iterrows()中的行:
结果[行['concept'][行['label']]=行['value']
我希望得到的是:
{
‘b1’:{
“a1”:1.0,
“a2”:0.6
},
“b2”:{
“a1”:0.5,
“a2”:0.6,
},
“b3”:{
“a1”:0.2,
“a2”:0.8,
},
“b4”:{
“a1”:0.7,
“a2”:0.7
}
}
但是,每次循环遇到一个已经存在的b
值时,它都会正确地向字典中添加一个新的a
键,该键具有正确的值,但会更改以前添加的值。对于上面的例子,我得到:
{
‘b1’:{
“a1”:0.7,
“a2”:0.7
},
“b2”:{
“a1”:0.7,
“a2”:0.7,
},
“b3”:{
“a1”:0.7,
“a2”:0.7,
},
“b4”:{
“a1”:0.7,
“a2”:0.7
}
}
我肯定我错过了一些非常明显的东西,但这让我想把头撞到墙上!有人能提供一些见解吗?我尝试了另一种方法,使用新的数据框架,将标签和概念分别作为列和索引,但与嵌套字典相比,逐个填充每个单元格的速度太慢。尝试旋转表,然后转换为字典
df.pivot_table(index='label',columns='concept',values='value').to_dict()
您只创建了一个dict,因为python不会为您复制它。因此,您在结果中的键值对的所有值部分中引用相同的dict 另一种方法是如下初始化结果,并保持其余代码不变:
results = {x: dict.fromkeys(df['label'].unique(), 0) for x in dict.fromkeys(df['concept'].unique())}
这将为您提供预期的输出
或者,您可以更改方法并使用Mark提到的透视表:
df.pivot_table(index='label',columns='concept',values='value').to_dict()
哦,为什么我没想到旋转?!非常感谢。非常感谢你的解释——这很有道理!如果你对答案投赞成票,我会感谢你,尽管你接受马克的答案。完成了,尽管它没有显示出来,因为我还没有足够的声誉。对不起!