Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python嵌套字典中的内部值无明确原因地更改_Python_Pandas_Dictionary_Nested - Fatal编程技术网

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()

哦,为什么我没想到旋转?!非常感谢。非常感谢你的解释——这很有道理!如果你对答案投赞成票,我会感谢你,尽管你接受马克的答案。完成了,尽管它没有显示出来,因为我还没有足够的声誉。对不起!