转换数据框以获得共同作者关系

时间:2015-01-14 04:58:55

标签: python numpy pandas

我有一个作者及其论文的数据框:

     author paper
0      A     z
1      B     z
2      C     z
3      D     y
4      E     y
5      C     y
6      F     x
7      G     x
8      G     w
9      B     w

我希望得到每对作者共有多少篇论文的矩阵。

   A B C D E F G
A   
B  1  
C  1 1  
D  1 0 1  
E  0 0 1 1 
F  0 0 0 0 0 
G  0 1 0 0 0 1

有没有办法使用pandas转换DataFrame来获得此结果?或者是否有一种更有效的方法(比如numpy)这样做,以便它可以扩展?

1 个答案:

答案 0 :(得分:1)

我第一次找到的

get_dummies在这里并不像希望的那样方便;需要添加额外的groupby。相反,添加虚拟列或使用自定义aggfunc实际上更简单。例如,如果我们从这样的df开始(请注意我添加了一篇额外的论文a,以便至少有一对写了多篇论文的对象)

>>> df
   author paper
0       A     z
1       B     z
2       C     z
[...]
10      A     a
11      B     a

我们可以添加一个虚拟刻度列,枢轴,然后使用this question中的“它只是一个点积”观察:

>>> df["dummy"] = 1
>>> dm = df.pivot("author", "paper").fillna(0)
>>> dout = dm.dot(dm.T)
>>> dout
author  A  B  C  D  E  F  G
author                     
A       2  2  1  0  0  0  0
B       2  3  1  0  0  0  1
C       1  1  2  1  1  0  0
D       0  0  1  1  1  0  0
E       0  0  1  1  1  0  0
F       0  0  0  0  0  1  1
G       0  1  0  0  0  1  2

其中对角线计算作者撰写的论文数量。如果你真的想要消除对角线及以上,我们也可以这样做:

>>> dout.values[np.triu_indices_from(dout)] = 0
>>> dout
author  A  B  C  D  E  F  G
author                     
A       0  0  0  0  0  0  0
B       2  0  0  0  0  0  0
C       1  1  0  0  0  0  0
D       0  0  1  0  0  0  0
E       0  0  1  1  0  0  0
F       0  0  0  0  0  0  0
G       0  1  0  0  0  1  0