【问题标题】:Generate a matrix of dependencies between elements生成元素之间的依赖矩阵
【发布时间】:2020-01-06 17:21:04
【问题描述】:

我必须在数据框的元素之间建立一个依赖矩阵。 's' 列中的每个元素都有一个不同节点的列表(从 1 到 70)和相应的时间('t' 列)。任务是找到所有节点之间的所有依赖关系,并将时间值的总和放入表中。

例如: 节点sa1与以下节点有连接:sa2,sa3(0行),sa3(1行),sa5,sa9(3行)

对于节点 sa2、sa5、sa9 可以直接使用列“t”中的值,因为它们只出现一次。节点 3 出现在两行中,因此我们添加了 't' 值。

我尝试用许多 for 循环来解决它,但我有时间问题,处理数据大约需要 50 分钟,所以需要一些提示如何准备数据进行分析。

正如我刚刚注意到的,只需要计算主对角线上方的元素,主对角线将是 NaN,而主对角线下方的元素只是镜像。

这就是我的输入示例的样子

         s           t 

 0  sa1,sa2,sa3     10
 1  sa1,sa3         20
 2  sa1,sa5,sa9     123

这是生成上述表格的代码

sas = pd.Series(['sa1,sa2,sa3', 'sa1,sa3', 'sa1,sa5,sa9'], name='s')
times = pd.Series([10, 20, 123], name='t')
df = pd.concat([sas, times], axis=1)

我希望得到下表

    sa1    sa2    sa3    sa4    sa5    ...    sa9  
sa1  -     10      30           123           123
sa2  10     -
sa3  30              - 
sa4                       -
sa5 123                          -
...                                     -
sa9 123                                        -

【问题讨论】:

    标签: python pandas algorithm data-science


    【解决方案1】:

    使用dot很容易实现

    s=df.s.str.get_dummies(',')
    s=s.mul(df.t,0).T.dot(s)
    s.values[[np.arange(s.shape[0])]*2] = 0
    s
    Out[104]: 
         sa1  sa2  sa3  sa5  sa9
    sa1    0   10   30  123  123
    sa2   10    0   10    0    0
    sa3   30   10    0    0    0
    sa5  123    0    0    0  123
    sa9  123    0    0  123    0
    

    【讨论】:

    • 如果您将一些 cmets 添加到您的出色解决方案中,我将非常感谢,我不仅要学习复制粘贴,谢谢!
    • @AndreyMazur 这更像是矩阵倍数,在 pandas 中,当你有相同的键和列时,它会将它组合在一起
    • @AndreyMazur 当你有虚拟变量时,我们将值作为列和索引与原始数据帧相同,然后在转置后我们可以多个两个矩阵得到预期结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2017-07-08
    相关资源
    最近更新 更多