dict-to-cs中嵌套列表的展平

2024-09-29 22:35:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究如何在dict中展开嵌套列表,dict是使用python嵌套在列表中的。在

示例如下:

[
 {
    "id": 8,
    "category": {
        "id": 0,
        "name": "lion"
    },
    "name": "Leon",
    "photoUrls": [
        "123",
        "444",
    ],
    "tags": [
        {
            "id": 1,
            "name": "TagLion"
        },
        {
            "id": 2,
            "name": "KingOfTheJungle"
        }
    ],
},

{
    "id": 83,
    "category": {
        "id": 0,
        "name": "dog UPDATED"
    },
    "name": "Buff",
    "photoUrls": [
        "333",
    ],
    "tags": [
        {
            "id": 1,
            "name": "TagNumber1UPDATED"
        },
        {
            "id": 2,
            "name": "DogWithStickUPDATED"
        }
    ],
}
]

从上面的示例中,这是一个来自API的返回,我想将输出写入csv。但是这里的捕获点在“tags”上,它是一个嵌套列表。我希望上面的结果扁平化为csv格式,如下所示:

^{pr2}$

如何使用python实现这一点?希望将此设置为配置,当加载到csv时,python将查找此配置来展开数组“标记”

编辑: 希望将photourls列也展平,这是一个数组。结果如下,通过管道而不是分裂它。在

id | category                       | name | photoUrls     | tags
 8 |{'id': 0, 'name': 'dog UPDATED'}| Leon | 123 |444      | {'id': 1, "name": "TagLion"}
 8 |{'id': 0, 'name': 'dog UPDATED'}| Leon | 123           | {'id': 1, "name": "TagLion"}
 8 |{'id': 0, 'name': 'dog UPDATED'}| Leon | 123           | {'id': 2, "name": "KingOfTheJungle"}
83 |{'id': 0, 'name': 'dog UPDATED'}| Buff | 333           | {"id": 1,"name": "TagNumber1UPDATED"}
83 |{'id': 0, 'name': 'dog UPDATED'}| Buff | 333           | {"id": 2,"name": "name": "DogWithStickUPDATED"}

Tags: csvnameid示例列表tagsdictbuff
2条回答

你可以使用神奇的pandas包的力量:

代码:

import pandas as pd

data = [] # your list is here

df = pd.DataFrame(data)

# expand 'tags' column into multiple rows
tags = df.apply(lambda x: pd.Series(x['tags']), axis=1).stack().reset_index(level=1, drop=True)
tags.name = 'tags'
df = df.drop('tags', axis=1).join(tags)

print(df)

印刷品:

^{pr2}$

对于转储到CSV,可以使用^{} method。在


您还可以将“展开列”逻辑提取到单独的方法中并重用:

def expand_column(df, column_name):
    c = df.apply(lambda x: pd.Series(x[column_name]), axis=1).stack().reset_index(level=1, drop=True)
    c.name = column_name
    return df.drop(column_name, axis=1).join(c)

用法:

df = pd.DataFrame(data)
df = expand_column(df, 'tags')

可以使用嵌套理解:

import csv
d = [{'id': 8, 'category': {'id': 0, 'name': 'lion'}, 'name': 'Leon', 'photoUrls': ['123'], 'tags': [{'id': 1, 'name': 'TagLion'}, {'id': 2, 'name': 'KingOfTheJungle'}]}, {'id': 83, 'category': {'id': 0, 'name': 'dog UPDATED'}, 'name': 'Buff', 'photoUrls': ['333'], 'tags': [{'id': 1, 'name': 'TagNumber1UPDATED'}, {'id': 2, 'name': 'DogWithStickUPDATED'}]}]
new_d = [[i['id'], i['category'], i['name'], *i["photoUrls"], c] for i in d for c in i['tags']]
with open('results.csv', 'w') as f:
  write = csv.writer(f)
  write.writerows([['id', 'category', 'name', 'photoUrls', 'tags'], *new_d])

输出:

^{pr2}$

相关问题 更多 >

    热门问题