Python 如何在pandas/numpy中制作百分比矩阵?
我正在努力在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. 鹅饲料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. 鹅饲料 这里需要一些步骤。在第一步中,我们
这里需要一些步骤。在第一步中,我们删除重复项以避免重复计数和透视:
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