匹配数据帧中dict列表中的str值

2024-10-04 09:24:11 发布

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

我有一个应用程序,我正在尝试自动化。为了收集所有需要的信息,我必须对应用程序中的每个节点运行一个API调用。我使用以下函数来执行此操作:

def node_df(self, nodes):
    lst_dict = []
    for node in nodes:
        jsonstr = self.session.get_hdw_node(node)
        lst_dict.append(jsonstr)
    df1 = pd.DataFrame()
    df2 = df1.append(lst_dict)
    drop = df2.drop(["nodeType", "timestamp"], axis=1)
    return drop

单节点JSON输出:

{
    "Nodes": [{
        "id": "P1_H17_F03_JN0@00-9C7719-839318-409186-3459CB[0-1-94]",
        "timestamp": "2019-12-11T16:22:55Z",
        "name": "P1_H17_F03_JN0",
        "node": "node1@00-E4DEA9-90EB54-48BE9D-7C7D62[1-1-10]",
        "dataSet": [{
            "dev": "0x003C"
        }, {
            "dev": "0x00C2"
        }, {
            "dev": "0x002A"
        }, {
            "dev": "0x0048"
        }, {
            "dev": "0x0011"
        }, {
            "dev": "0x0024"
        }],
        "nodeType": "HardwareNodeBlock"
    }]
}

输出创建以下数据帧:

    dataSet                                             node                                            id
0   [{'dev': '0x003C'}, {'dev': '0x00C2'}, {'dev'...    node1@00-E4DEA9-90EB45-48BE9D-7C7D62[1-1-10]    P1_H17_F03_JN0@00-9C7719-839318-409...
1   [{'dev': '0x0020'}, {'dev': '0x0038'}, {'dev'...    node2@00-32BF13-BABA54-4B7FBF-B34F5B[1-1-8] P1_H14_F04_JN1@00-77E5FA-C1055C-4E0...
2   [{'dev': '0x0112'}, {'dev': '0x0113'}, {'dev'...    node2@00-32BF13-BABA54-4B7FBF-B34F5B[1-1-8] P1_H14_F04_JN2@00-F3D05C-08DB23-443...
3   [{'dev': '0x00E9'}, {'dev': '0x00EC'}, {'dev'...    node2@00-32BF13-BABA54-4B7FBF-B34F5B[1-1-8] P1_H14_F04_JN3@00-DC0EED-31DE6C-4B3...
4   [{'dev': '0x004B'}, {'dev': '0x0061'}, {'dev'...    node2@00-32BF13-BABA54-4B7FBF-B34F5B[1-1-8] P1_H14_F04_JN4@00-3A57F1-E7A3B6-44E...

我正在尝试匹配来自df["dataSet"]的值'0x0113',以便返回行以获取df["id"]'0x0113'是连接到节点的设备之一

通常我会做一个df.loc[df['dataSet'].str.match('0x0113')],但这里当然没那么简单。如何做到这一点?我想最好先合并dataSet键,因为它们都有相同的键名

非常感谢您的帮助


Tags: devidnodedf节点datasetdictdrop
1条回答
网友
1楼 · 发布于 2024-10-04 09:24:11

我想办法解决这个问题。我首先将这些键合并到一个字典中,在node_df函数中将以下函数应用于我的数据帧:

def consolidate_dataset(data):
    final = {}
    for dev in data:
        for key, val in dev.items():
            final.setdefault(key, []).append(val)
    return final


def node_df(self, nodes):
    ...
    df2 = df1.append(lst_dict)
    df2["dataSet"] = df2["dataSet"].apply(self.consolidate_dataset)
    ...

输出:

{'dev': ['0x003C', '0x00C2', '0x002A', '0x0048', '0x0011', '0x0024']}

然后我决定我根本不需要这个键,用一个函数来替换consolidate_dataset,把dataSet变成一个列表

def dataset_list(data):
    final = []
    for dev in data:
        for _key, val in dev.items():
            final.append(val)
    return final

输出:

['0x003C', '0x00C2', '0x002A', '0x0048', '0x0011', '0x0024']

现在我可以很容易地匹配数据帧中的值'0x0113',得到df["id"]

df2[['0x0113' in dev for dev in df2['dataSet']]]

输出:

    dataSet                         node                                     id
2   ['0x0112', '0x0113', '0x0114']  node2@00-32BF13-BABA45-4B7FBF-B34F5B[1-1-8] P1_H14_F04_JN31@00-F3D05C-08DB23-443...

相关问题 更多 >