【问题标题】:Inner values in Python nested dictionary changing for no clear reasonPython 嵌套字典中的内部值无故更改
【发布时间】:2019-12-26 23:09:03
【问题描述】:

我正在尝试创建一个嵌套字典,由 Pandas 数据框中的两列索引,但每次将新键添加到内部字典时,内部值都会发生变化。

我的意图是有一个字典,其键是一个数据框列中的值,其值是具有另一列键的字典,其中内部字典的值来自第三列。我从嵌套字典的空白结构开始,遍历数据框的行,并相应地更新字典值。

(我将展示我的意思以及我对虚拟值的尝试。)

import pandas as pd

df = pd.DataFrame({'label': ['a1', 'a1', 'a1', 'a1', 'a2', 'a2', 'a2', 'a2'],
                   'concept': ['b1', 'b2', 'b3', 'b4', 'b1', 'b2', 'b3', 'b4'],
                   'value': [1, 0.5, 0.2, 0.7, 0.6, 0.4, 0.8, 0.7]})
results = dict.fromkeys(df['b'].unique(), dict.fromkeys(df['a'].unique(), 0))

for i, row in df.iterrows():
    results[row['concept']][row['label']] = row['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
  }
}

我确定我一定遗漏了一些非常明显的东西,但这让我想把头撞到墙上!任何人都可以提供任何见解吗?我尝试了另一种方法,使用新的数据框,标签和概念分别作为列和索引,但与嵌套字典相比,一个一个地填充每个单元格太慢了。

【问题讨论】:

    标签: python pandas dictionary nested


    【解决方案1】:

    尝试旋转表格,然后转换为字典。

    df.pivot_table(index='label',columns='concept',values='value').to_dict()
    

    【讨论】:

    • 天啊,我为什么没有想到旋转?!谢谢!
    【解决方案2】:

    您只创建一个字典,因为 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()
    

    【讨论】:

    • 非常感谢您的解释 - 这是有道理的!
    • 如果您支持答案,我将不胜感激,尽管接受马克的回答。
    • 完成了,虽然没有显示,因为我还没有足够的声望,抱歉!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2022-06-13
    • 2021-04-14
    • 1970-01-01
    • 2021-02-01
    相关资源
    最近更新 更多