Python 字典将行转置为列

Python Dictionary transpose rows as column

我有一个 CSV 文件,将被导入并转换成字典。

with open(r"DictionaryQuestion.csv", encoding='utf-8-sig') as csvfile:
csvReader = csv.DictReader(csvfile)
for row in map(dict, csvReader):
    print(row)

Example Input

我希望能够转置数据,以便将折扣和非折扣行添加为列及其相关金额,并删除重复项。本质上,我想要一本新词典,这样我就可以快速浏览它。

这是所需的输出。

Desired Output as Dictionary

您可以使用 itertools.groupby() 按 productId 对记录进行分组,然后更新您的数据。

下面我转换了一个列表,该列表的记录与您的记录相同,并创建了包含预期数据的新列表。

data = [
    {
        "ProductId": "1", "Brand": "Brand1", "rateamount": 1, "rate_type": "Discount" 
    },
    {
        "ProductId": "1", "Brand": "Brand1", "rateamount": 2, "rate_type": "NonDiscount" 
    },
    {
        "ProductId": "2", "Brand": "Brand2", "rateamount": 3, "rate_type": "Discount" 
    },
    {
        "ProductId": "2", "Brand": "Brand2", "rateamount": 4, "rate_type": "NonDiscount" 
    },
    {
        "ProductId": "3", "Brand": "Brand3", "rateamount": 5, "rate_type": "Discount" 
    },
    {
        "ProductId": "3", "Brand": "Brand3", "rateamount": 6, "rate_type": "NonDiscount" 
    },
    {
        "ProductId": "4", "Brand": "Brand4", "rateamount": 7, "rate_type": "Discount" 
    },
    {
        "ProductId": "4", "Brand": "Brand4", "rateamount": 2, "rate_type": "NonDiscount" 
    },
]

解决方案

假设您的数据按 productId 排序,否则您需要在分组前先排序。

import itertools

groups = itertools.groupby(data, lambda e: {"ProductId": e["ProductId"], "Brand": e["Brand"]})

output = []
for group, items in groups:
    el = dict(group)
    for item in items:
        if item["rate_type"] == "Discount":
            el["Discount"] = item["rateamount"]
        else:
            el["NonDiscount"] = item["rateamount"]
    output.append(el)

print(output)

上面的for循环可以转为map

import itertools

groups = itertools.groupby(data, lambda e: {"ProductId": e["ProductId"], "Brand": e["Brand"]})

output = map(
    lambda group: dict(
    **group[0],
    **{
        item["rate_type"]: item["rateamount"] for item in group[1]
    }),
    groups
)

print(list(output))

两种打印方式

[
 {'ProductId': '1', 'Brand': 'Brand1', 'Discount': 1, 'NonDiscount': 2},
 {'ProductId': '2', 'Brand': 'Brand2', 'Discount': 3, 'NonDiscount': 4},
 {'ProductId': '3', 'Brand': 'Brand3', 'Discount': 5, 'NonDiscount': 6},
 {'ProductId': '4', 'Brand': 'Brand4', 'Discount': 7, 'NonDiscount': 2}
]