我有一个表格,其中包含与文章相关的关键字,如下所示:
article_id keyword
1 A
1 B
1 C
2 A
2 B
2 D
3 E
3 F
3 D
我需要一个数据透视表:
A B C D E F
A - 2 1 1 0 0
B - - 1 1 0 0
C - - - 0 0 0
D - - - - 1 1
E - - - - - 1
F - - - - - -
这意味着,对 (A, B)
出现在两篇文章(#1 和 #2)中,对 (A, C)
只出现在一篇文章(#1)等
最符合 Pythonic 的方法是什么?
我尝试了 Pandas 数据透视表,但到目前为止没有成功。只是不知道如何连接关键字和文章 ID。
这个问题Create adjacency matrix for two columns in pandas dataframe没有解决问题。
最佳答案
使用crosstab
和dot
。然后,您可以使用 np.triu
仅保留矩阵的上半部分(其他所有内容都设置为 0)。
u = pd.crosstab(df.article_id, df.keyword)
v = u.T.dot(u)
pd.DataFrame(np.triu(v, k=1), index=v.index.values, columns=v.columns.values)
A B C D E F
A 0 2 1 1 0 0
B 0 0 1 1 0 0
C 0 0 0 0 0 0
D 0 0 0 0 1 1
E 0 0 0 0 0 1
F 0 0 0 0 0 0
或者,对于最后一步,您可以将无效值设置为“-1”,作为无效值的“-”的更好替代方案。
v.values[np.tril_indices_from(v)] = -1
print(v)
keyword A B C D E F
keyword
A -1 2 1 1 0 0
B -1 -1 1 1 0 0
C -1 -1 -1 0 0 0
D -1 -1 -1 -1 1 1
E -1 -1 -1 -1 -1 1
F -1 -1 -1 -1 -1 -1
关于python - 使用 Pandas 对每组关键字对进行交叉制表计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53802016/