2017-07-10 68 views
5

我正在使用Python熊猫。我有一个字符串的列,我想在列之间交叉。熊猫交叉制表和计数

例如,我有以下的输入

1: Andi 
2: Andi, Cindy 
3: Thomas, Cindy 
4: Cindy, Thomas 

我想有以下输出:

因此,安迪和托马斯的组合不会出现在该数据,但Cindy和托马斯出现两次。

  Andi Thomas Cindy 
    Andi 1  0  1 
    Thomas 0  1  2 
    Cindy 1  2  1 

有人知道我该如何处理这个问题吗?那真是太棒了!

非常感谢和问候,

安迪

回答

9

您可以首先生成虚拟列:

df['A'].str.get_dummies(', ') 
Out: 
    Andi Cindy Thomas 
0  1  0  0 
1  1  1  0 
2  0  1  1 
3  0  1  1 

和使用,在该点积:

tab = df['A'].str.get_dummies(', ') 

tab.T.dot(tab) 
Out: 
     Andi Cindy Thomas 
Andi  2  1  0 
Cindy  1  3  2 
Thomas  0  2  2 

对角线元素会给你每个人的发生次数。如果您需要将对角线设置为1,则有several alternatives。其中之一是来自numpy的np.fill_diagonal

co_occurrence = tab.T.dot(tab)  
np.fill_diagonal(co_occurrence.values, 1)  
co_occurrence 
Out: 
     Andi Cindy Thomas 
Andi  1  1  0 
Cindy  1  1  2 
Thomas  0  2  1 
+1

很好的答案! ( - ; – piRSquared

+0

@piRSquared谢谢:) – ayhan

+2

@ayhan这就是我喜欢Stack Overflow的原因。我学会了使用'.dot'来计算系列中的交叉表报告。 +1 –