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

Transform dataframe to get co-author relationships

我有作者及其论文的 DataFrame:

     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)来实现它的可扩展性?

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 的 "it's simply a dot product" 观察:

>>> 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