python - 使用 Pandas 对每组关键字对进行交叉制表计数

标签 python pandas dataframe group-by pandas-groupby

我有一个表格,其中包含与文章相关的关键字,如下所示:

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没有解决问题。

最佳答案

使用crosstabdot。然后,您可以使用 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/

相关文章:

python - 正则表达式和 unicode

javascript - 从 python shell 发送 javascript 命令

python - 根据 date_time 索引替换数据切片的值?

python - 使用 python 和 pandas 按数据框分组

python - 将两个相关的 DataFrame 列拆分为两个新的 DataFrame

python - Pandas 类似于 SQL MINUS/EXCEPT 运算符,使用多列

python - 为什么我的简单 python gtk+cairo 程序运行如此缓慢/断断续续?

python - Windows 上的 OpenCV 安装失​​败

python - Pandas 用列名替换空值

python - 根据日期和以前的值填写缺失的数据