清理并用复杂的层次结构替换数据

时间:2019-07-18 11:37:29

标签: python data-cleansing

我具有复杂的层次结构数据-列表,字典,字符串。 我需要找到所有包含'?'的值,将其及其后的所有内容都删除,然后插入清理后的内容。 我不知道如何正确执行-就我目前的水平而言,这有点复杂。

我尝试了列表中的字符串:

    parsed["data"] = [{'dimensions':[{'name': '608907?afwafaw'}], 'metrics': [1.0, 2.0]}, {'dimensions':[{'name': '189812?awfawg'}], 'metrics': [2.0, 3.0]}]

我希望:

parsed["data"] = [{'dimensions':[{'name': '608907'}], 'metrics': [1.0, 2.0]}, {'dimensions':[{'name': '189812'}], 'metrics': [2.0, 3.0]}]

没有任何'?blablabla',只是int

2 个答案:

答案 0 :(得分:2)

这是一个没有任何外部依赖项的递归解决方案,它应该适用于任何深层对象:

...
parsed["data"] = [{'dimensions':[{'name': '608907?afwafaw'}], 'metrics': [1.0, 2.0]}, {'dimensions':[{'name': '189812?awfawg'}], 'metrics': [2.0, 3.0]}]

def cleanse(obj):
    if isinstance(obj, dict):
        for key in obj.keys():
            obj[key] = cleanse(obj[key])
    elif isinstance(obj, list):
        for i in range(len(obj)):
            obj[i] = cleanse(obj[i])
    elif isinstance(obj, str):
        return obj.split('?')[0] # split at question mark and take only the first part, which is a number
    return obj


cleanse(parsed['data'])

print(parsed['data']) # output: [{'dimensions': [{'name': '608907'}], 'metrics': [1.0, 2.0]}, {'dimensions': [{'name': '189812'}], 'metrics': [2.0, 3.0]}]

答案 1 :(得分:1)

如果所有数据看起来像您的示例,则应该这样做:

for record in parsed["data"]:
    for dim in record["dimensions"]:
        dim["name"] = dim["name"].split("?")[0]

它仅检查“维度”中的“名称”,因为这是需要清除的值。无需费心检查该值是否已包含问号,因为如果没有,这将是一个空操作。