【问题标题】:remapping numeric items in data frame to labels with nested dictionary将数据框中的数字项重新映射到带有嵌套字典的标签
【发布时间】:2021-07-14 20:25:37
【问题描述】:

构建数据:

data = pd.DataFrame({'ebe5eb3c': [1, 3, 4, -1, 1], 
        'd9cd9ja6': [1, 1, 0, 1, 0], 
        '32aq-c79': [1, 2, 1, 1, 2], 
        'e2c-8b7e': [1, 4, 2, 2, 1]})

mydict = dict()
mydict = ([['ebe5eb3c',[{'value': '1', 'response': 'None'}, {'value': '2', 'response': 'Several days'}, {'value': '4', 'response': 'Nearly every day'},{'value': '-7', 'response': 'Every day'},{'value': '-1', 'response': 'Do not know'}]],
          ['d9cd9ja6',[{'value': '1', 'response': 'Yes'}, {'value': '0', 'response': 'No', 'please go to question': '7'}]],
          ['z2aq-c79',[{'value': '1', 'response': 'True'},{'value': '2', 'response': 'False'}]],
          ['e2c-8b7e',[{'value': '1', 'response': '5-10 years'}, {'value': '2', 'response': '10-15 years'},{'value': '3', 'response': '15-20 years'},{'value': '4', 'response': '20-25 years'}]]])

我有一个包含多列的数据框,并且行对应于每个主题的答案。我需要将数据框中的原始数值重新映射到字典(mydict)中显示的实际标签。该字典以列名作为键的问题标识符嵌套,值级别包括多个不同的项。

这只是一个示例数据集 - 我需要这样做的原因是有数百个这样的列..

我尝试遍历列并应用 .map 和 .replace 但没有运气。

非常欢迎任何建议。谢谢!

【问题讨论】:

  • 在您的示例中,mydict 的类型为 list。这是正确的吗?
  • 嗨安德烈 - 好点。实际上没有,我从模板数据库创建了一个字典,类似于以下mydict2 = columns=dict(zip(df['question'], col2["response"])) - 但出于隐私原因,我没有在此处包含确切的字典。可以在这里使用列表作为代理吗?如果你 dict(mydict) 那应该排序?
  • 哦.. 我们可以跳过创建 mydict2 的步骤,只映射两个数据帧吗?您可以发布原始 df 以及您预期的输出 df 吗?
  • 嗨@ScottBoston - 我不会发布原始数据框,因为它很大。 mydict 中的问答信息来自一个非常非常深的嵌套 json,它将其答案信息存储为一个嵌套的 dict - 所以在我的数据框中,每个问题的所有信息都存储为一个单元格中的列表(我知道它是一个有点乱……但这是我得到的数据,对那里的其余数据有意义……)所以映射数据帧不起作用。我想做的是例如用标签'none'替换问题ebe5eb3c answer 1。这有意义吗?

标签: pandas dictionary nested


【解决方案1】:

根据您的 cmets:

我假设,你有这种形式的字典:

mydict = {
    "ebe5eb3c": [
        {"value": "1", "response": "None"},
        {"value": "2", "response": "Several days"},
        {"value": "4", "response": "Nearly every day"},
        {"value": "-7", "response": "Every day"},
        {"value": "-1", "response": "Do not know"},
    ],
    "d9cd9ja6": [
        {"value": "1", "response": "Yes"},
        {"value": "0", "response": "No", "please go to question": "7"},
    ],
    "z2aq-c79": [
        {"value": "1", "response": "True"},
        {"value": "2", "response": "False"},
    ],
    "e2c-8b7e": [
        {"value": "1", "response": "5-10 years"},
        {"value": "2", "response": "10-15 years"},
        {"value": "3", "response": "15-20 years"},
        {"value": "4", "response": "20-25 years"},
    ],
}

那么你可以这样做:

for k, v in mydict.items():
    if k in data.columns:
        data[k] = data[k].apply(
            lambda x: next(
                (d["response"] for d in v if d["value"] == str(x)), x
            )
        )
print(data)

打印:

           ebe5eb3c d9cd9ja6  32aq-c79     e2c-8b7e
0              None      Yes         1   5-10 years
1                 3      Yes         2  20-25 years
2  Nearly every day       No         1  10-15 years
3       Do not know      Yes         1  10-15 years
4              None       No         2   5-10 years

【讨论】:

  • 太棒了,非常感谢!如果您有时间,还有一个次要问题是 - 您将如何对包含多个答案的单元格做同样的事情?
猜你喜欢
  • 2015-07-24
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多