簡體   English   中英

如何對嵌套字典列表中的值進行排序、分組和聚合?

[英]How to sort, group, and aggregate values in a list of nested dictionaries?

鑒於下面的字典列表,我想做以下事情:

1:按key(頂級)'name'對以下數據進行排序
2:按“items”鍵下的嵌套鍵“name”排序
3:按聚合間隔對項目下的值進行分組,例如“1d”
4:再次從第 3 步獲取 min max 和 avg 結果\

Atm,我通過迭代到值來解決這個問題,並將它們與 pandas 分組,再次從結果中聚合 min max 和 avg。 這種方式感覺真的很棘手,性能不給。

有人可以幫我嗎?

[
    {
        '_id': 2,
        'name': 'b',
        'device': 'b',
        'items': [
            {
                'item_id': 'item_id_2', 'name': 'item_2', 'unit': 'b/s',
                'values': [
                    {'time': datetime.datetime(2022, 9, 5, 15, 0), 'min': 0.0, 'max': 1.0, 'avg': 0.5},
                    {'time': datetime.datetime(2022, 9, 5, 16, 0), 'min': 0.0, 'max': 1.0, 'avg': 0.5},
                    {'time': datetime.datetime(2022, 9, 5, 17, 0), 'min': 0.0, 'max': 1.0, 'avg': 0.5},
                    {'time': datetime.datetime(2022, 9, 5, 18, 0), 'min': 0.0, 'max': 1.0, 'avg': 0.5},
                    {'time': datetime.datetime(2022, 9, 5, 19, 0), 'min': 0.0, 'max': 1.0, 'avg': 0.5},
                    {'time': datetime.datetime(2022, 9, 5, 20, 0), 'min': 0.0, 'max': 1.0, 'avg': 0.5},
                ]
            }
        ]
    },
    {
        '_id': 1,
        'name': 'a',
        'device': 'a',
        'items': [
            {
                'item_id': 'item_id_1', 'name': 'item_1', 'unit': 'b/s',
                'values': [
                    {'time': datetime.datetime(2022, 9, 5, 15, 0), 'min': 0.0, 'max': 1.0, 'avg': 0.5},
                    {'time': datetime.datetime(2022, 9, 5, 16, 0), 'min': 0.0, 'max': 1.0, 'avg': 0.5},
                    {'time': datetime.datetime(2022, 9, 5, 17, 0), 'min': 0.0, 'max': 1.0, 'avg': 0.5},
                    {'time': datetime.datetime(2022, 9, 5, 18, 0), 'min': 0.0, 'max': 1.0, 'avg': 0.5},
                    {'time': datetime.datetime(2022, 9, 5, 19, 0), 'min': 0.0, 'max': 1.0, 'avg': 0.5},
                    {'time': datetime.datetime(2022, 9, 5, 20, 0), 'min': 0.0, 'max': 1.0, 'avg': 0.5},
                ]
            }
        ]
    }
]

至於結果,我希望是這樣的:

[
    {
        '_id': 1,
        'name': 'a',
        'device': 'a',
        'items': [
            {
                'item_id': 'item_id_1', 'name': 'item_1', 'unit': 'b/s',
                'values': [
                    {'time': datetime.datetime(2022, 9, 5, 0, 0), 'min': 0.0, 'max': 1.0, 'avg': 0.5},
                ]
            }
        ]
    },
    {
        '_id': 1,
        'name': 'b',
        'device': 'b',
        'items': [
            {
                'item_id': 'item_id_2', 'name': 'item_2', 'unit': 'b/s',
                'values': [
                    {'time': datetime.datetime(2022, 9, 5, 0, 0), 'min': 0.0, 'max': 1.0, 'avg': 0.5},
                ]
            }
        ]
    }
]

使用您提供的初始字典列表並且我選擇調用data ,這是一種方法:

df = pd.DataFrame(data)

# First, sort values
df = df.assign(temp=df["items"].apply(lambda x: x[0]["name"])).pipe(
    lambda df_: df_.sort_values(by="temp").drop(columns="temp").reset_index(drop=True)
)

# Get aggregated as new column 'temp'
dfs = df["items"].apply(lambda x: pd.DataFrame(x[0].pop("values", None)))
df["temp"] = pd.Series(
    [
        {
            k: v[0]
            for k, v in df.set_index("time")
            .resample("D")
            .mean()
            .reset_index()
            .to_dict(orient="list")
            .items()
        }
        for df in dfs
    ]
)
df["items"] = df["items"].apply(lambda x: x[0])

# Merge intermediate dictionaries
df["items"] = df.apply(lambda x: x["items"] | {"values": [x["temp"]]}, axis=1)
df = df.drop(columns="temp")

所以:

print(df.to_json(orient="records"))
# Output
[
    {
        "_id": 1,
        "name": "a",
        "device": "a",
        "items": {
            "item_id": "item_id_1",
            "name": "item_1",
            "unit": "b\\/s",
            "values": [{"time": 1662336000000, "min": 0.0, "max": 1.0, "avg": 0.5}],
        },
    },
    {
        "_id": 2,
        "name": "b",
        "device": "b",
        "items": {
            "item_id": "item_id_2",
            "name": "item_2",
            "unit": "b\\/s",
            "values": [{"time": 1662336000000, "min": 0.0, "max": 1.0, "avg": 0.5}],
        },
    },
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM