Python 如何在pandas/numpy中制作百分比矩阵?

Python 如何在pandas/numpy中制作百分比矩阵?,python,pandas,dataframe,numpy,matrix,Python,Pandas,Dataframe,Numpy,Matrix,我正在努力在pandas/NumPy中获得类似矩阵数据帧的东西 我有以下数据帧 价值 来源 安置 弗斯特 A. 鹅饲料 1. 鹅饲料 A. 赛博网络 2. 鹅饲料 A. 鹅饲料 3. 鹅饲料 B 赛博网络 1. 赛博网络 B 鹅饲料 2. 赛博网络 C WowFeed 1. WowFeed C WowFeed 2. WowFeed C 赛博网络 3. WowFeed C 鹅饲料 4. WowFeed C 赛博网络 5. WowFeed D 鹅饲料 1. 鹅饲料 这里需要一些步骤。在第一步中,我们

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

我有以下数据帧

价值 来源 安置 弗斯特 A. 鹅饲料 1. 鹅饲料 A. 赛博网络 2. 鹅饲料 A. 鹅饲料 3. 鹅饲料 B 赛博网络 1. 赛博网络 B 鹅饲料 2. 赛博网络 C WowFeed 1. WowFeed C WowFeed 2. WowFeed C 赛博网络 3. WowFeed C 鹅饲料 4. WowFeed C 赛博网络 5. WowFeed D 鹅饲料 1. 鹅饲料
这里需要一些步骤。在第一步中,我们删除重复项以避免重复计数和透视:

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()
的作用)

我们得到了


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(如果这是重要的)

我设法使用PiterBarg回答并实现了我需要的一切。谢谢皮特堡

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


一句话:太棒了!这很有帮助,解释得很好,谢谢。我设法理解了你所做的事情,并且在一开始就删除了副本,这帮助了我进行了更多的计算。@MauriceF很高兴这有帮助!考虑将答案标记为“接受”,我只会有更多的问题,总的值(百分比)的总行(底部)没有意义,我问它是如何。这些值没有意义,应该是包括0%的列的平均值,不包括源与其自己的列匹配的字段。对吗?这应该会给出一个结果:所有来源的百分比都来自这个来源。问题2刚刚看到,百分比有问题。即使此列中没有任何值,也会计算它们。我将在另一个答案中添加图片。@MauriceF如果您的问题不太正确,您应该编辑您的问题,而不是添加信息作为答案

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