首页 > 解决方案 > 如果组成它的元组的任何项目不在数据框中,则删除字典键

问题描述

我有一个 dict 和一个 df,如下所示:

import networkx as nx
import pandas as pd
import scipy.spatial.distance as ssd
import numpy as np

dict_edge = {(1,2): {'Duration': 1.17, 'Numcalls':4},
             (3,2): {'Duration': 1.27, 'Numcalls':3},
             (3,4): {'Duration': 1.3, 'Numcalls':2}}

df = pd.DataFrame({'SJDR': [0,0,0,1],
                   'TR': [0,0,2,1],
                   'LD': [1,3,0,0]})

我需要在 中添加另一个项目dict_edge.values(),为此我使用以下迭代:

for key, value in zip(dict_edge.keys(), dict_edge.values()):
    x = df.loc[key[0]].to_numpy()
    y = df.loc[key[1]].to_numpy()
    cosine = 1 - ssd.cosine(x,y)
    value['Cosine_Similarity'] = cosine

但是,由于数据帧没有索引值为 4,我得到了关键错误。所以,我需要做的是检查构成dict_edge键的所有元组的所有项目是否都在df数据帧索引中。否则,我想删除整个项目(键和值),引用不在数据框中的元组项键。在此过滤之后,所需的 dict_edge 将如下所示:

dict_edge = {(1,2): {'Duration': 1.17, 'Numcalls':4},
             (3,2): {'Duration': 1.27, 'Numcalls':3}}

任何人都可以帮忙吗?

标签: pythonpandas

解决方案


您可以检查所有键是否都在索引中:

for key, value in zip(dict_edge.keys(), dict_edge.values()):
    if pd.Series(key).isin(df.index).all():
        x = df.loc[key[0]].values
        y = df.loc[key[1]].values
        cosine = 1 - ssd.cosine(x,y)
        value['Cosine_Similarity'] = cosine
    else:
        value['Cosine_Similarity'] = np.NaN

推荐阅读