转换数据框以获得共同作者关系
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
我有作者及其论文的 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