【问题标题】:How to make a percentage matrix in pandas/numpy?如何在 pandas/numpy 中制作百分比矩阵?
【发布时间】:2021-06-23 18:04:29
【问题描述】:

我正在努力在 pandas/NumPy 中获得类似矩阵数据框的东西。

我有以下数据框

Value Source Placement First
A GooFeed 1 GooFeed
A CyberCyber 2 GooFeed
A GooFeed 3 GooFeed
B CyberCyber 1 CyberCyber
B GooFeed 2 CyberCyber
C WowFeed 1 WowFeed
C WowFeed 2 WowFeed
C CyberCyber 3 WowFeed
C GooFeed 4 WowFeed
C CyberCyber 5 WowFeed
D GooFeed 1 GooFeed

我想要实现的是具有彼此数据的提要的百分比。 Placement 中带有 1 的提要首先获得数据(值 A)。 有时,相同的值会出现在多个数据馈送中,来自同一馈送的多个展示位置也会出现在一个值中,例如值 C 和 Cyber​​Cyber​​。但这些值应该是唯一的,不能算作 WowFeed 数据的 2 倍。

我在一个单独的数据框中计算了总值,如下所示:

Source Firsts TotalDistinctValues FirstSources
GooFeed 2 4 {'CyberCyber':1;'WowFeed':1}
CyberCyber 1 3 {'GooFeed':1;'WowFeed':1}
WowFeed 1 1

我正在寻找的矩阵如下:

source GooFeed CyberCyber WowFeed Total
GooFeed 25% 25% 50%
CyberCyber 33% 33% 66%
WowFeed
Average 33% 25% 58%

不包括匹配自身的值源的列值的平均值(底行)。就像 GooFeed 的 GooFeed。

总计(右边的外行)应该是它自己的不同值的总和。

我真的不知道这应该如何工作。我是否可以在 pandas/NumPy 中尝试它?

我很高兴得到每一个帮助。

最好的问候

莫里斯

【问题讨论】:

    标签: python pandas dataframe numpy matrix


    【解决方案1】:

    我设法与 Piterbargs 合作来回答并实现我需要的一切。谢谢 Piterbarg!

    对于感兴趣的人,我会发布代码,因为我对其进行了一些编辑(注意 - 列/值的命名不同)。

    enter image description here

    enter image description here

    【讨论】:

      【解决方案2】:

      这里需要几个步骤。在第一步中,我们删除重复项以避免重复计算和枢轴:

      df2 = pd.pivot_table(df.drop_duplicates(['Value','Source','First']), index = 'Source', columns = 'First',values = 'Value',aggfunc = 'count', fill_value = 0)
      df2
      

      我们得到

      First       CyberCyber  GooFeed WowFeed
      Source          
      CyberCyber  1           1       1
      GooFeed     1           2       1
      WowFeed     0           0       1
      

      现在我们需要转换成比例并计算总计。有点棘手的一点是摆脱对角线(这是np.eye() 的来源)

      import numpy as np
      df3 = df2.div( df2.sum(axis=1), axis=0 )
      df4 = df3*(1 - np.eye(len(df3))
      df4['Total'] = df4.sum(axis=1)
      df4.loc['Total'] = df4.sum(axis=0)
      df4
      

      我们得到

      
      First       CyberCyber  GooFeed     WowFeed     Total
      Source              
      CyberCyber  0.00        0.333333    0.333333    0.666667
      GooFeed     0.25        0.000000    0.250000    0.500000
      WowFeed     0.00        0.000000    0.000000    0.000000
      Total       0.25        0.333333    0.583333    1.166667
      

      如果你愿意,你可以用 NaN 替换 0,比如说,使用 df4.replace(0,np.NaN) 并手动将右下角的单元格设置为 NaN,如果这是后果的话

      【讨论】:

      • 一个字:太棒了!这非常有帮助,而且解释得很好,谢谢。我设法理解了您所做的事情,并在一开始就删除重复项帮助我进行了更多计算。
      • @MauriceF 很高兴它有帮助!考虑根据guidelines 将答案标记为已接受
      • 我还有一些问题 总计值 百分比中的总计行(底部)与我的要求无关。这些值没有意义,应该是包含 0 % 的列的平均值,不包括源与其自己的列匹配的字段。正确的?这应该给出结果:所有来源的百分比来自此来源。
      • 问题 2 刚刚看到,百分比有问题。即使在此列中根本没有值,也会计算它们。我将在另一个答案中添加图片。
      • @MauriceF 如果您的问题不太正确,您应该编辑您的问题,而不是添加信息作为答案
      猜你喜欢
      • 2016-12-07
      • 2012-10-03
      • 2013-03-09
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多