我有一个作者及其论文的数据框:
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)这样做,以便它可以扩展?
答案 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