【问题标题】:Remove integer list keys from column headers从列标题中删除整数列表键
【发布时间】:2021-06-19 23:31:33
【问题描述】:

我有一个 Python 脚本,它使用了以前的 Stack Overflow solution 中的一个函数。

from pandas import json_normalize
from collections.abc import MutableMapping as mm
def flatten(dictionary, parent_key=False, separator='.'):
    items = []
    for key, value in dictionary.items():
        new_key = str(parent_key) + separator + key if parent_key else key
        if isinstance(value, mm):
            items.extend(flatten(value, new_key, separator).items())
        elif isinstance(value, list):
            for k, v in enumerate(value):
                items.extend(flatten({str(k): v}, new_key).items())
        else:
            items.append((new_key, value))
    return dict(items)

d = { 
    "_id" : 1, 
    "labelId" : [
        6422
    ], 
    "levels" : [
        {
            "active" : "true", 
            "level" : 3, 
            "actions" : [
                {
                    "isActive" : "true"
                }]
        }]
}

x = flatten(d)

x = json_normalize(x)

print(x)

电流输出:

   _id  labelId.0 levels.0.active  levels.0.level levels.0.actions.0.isActive 
0    1       6422            true               3                        true                           

我遇到的问题是列名中包含的数字键。有没有办法可以修改我的代码以实现我想要的输出?

所需的输出:

   _id    labelId   levels.active    levels.level     levels.actions.isActive 
0    1       6422            true               3                        true                           

【问题讨论】:

    标签: python pandas json-normalize


    【解决方案1】:

    首先使用parent_key 作为 bool 然后为其分配其他类型值不是最佳做法。它有效,但可能会变得混乱。我稍微修改了一段代码,添加了单独的参数来跟踪parent_key 状态为布尔值,p_key 带有你想要的字符串。这里是sn-p

    from pandas import json_normalize
    from collections.abc import MutableMapping as mm
    def flatten(dictionary, p_key=None, parent_key=False, separator='.'):
        items = []
        for key, value in dictionary.items():
            if parent_key:
                new_key = f"{str(p_key)}{separator}{key}"
            else:
                new_key = p_key if p_key else key
            if isinstance(value, mm):
                items.extend(flatten(
                    dictionary=value,
                    p_key=new_key,
                    parent_key=True,
                    separator=separator).items())
            elif isinstance(value, list):
                for k, v in enumerate(value):
                    items.extend(flatten(
                        dictionary={str(k): v},
                        p_key=new_key,
                        parent_key=False,
                        separator=separator).items())
            else:
                items.append((new_key, value))
        return dict(items)
    
    d = { 
        "_id" : 1, 
        "labelId" : [
            6422
        ], 
        "levels" : [
            {
                "active" : "true", 
                "level" : 3, 
                "actions" : [
                    {
                        "isActive" : "true"
                    }]
            }]
    }
    
    x = flatten(d)
    
    x = json_normalize(x)
    
    print(x)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2016-04-03
      • 2021-09-04
      相关资源
      最近更新 更多