在 pandas 数据框的行中查找相似性

finding similarities in rows for a pandas dataframe

我正在努力想出一种方法来有效地解决 pandas 中的这个数据整理问题。这是我的 pandas 数据框:

 brian steve joe tom
0   1    0   1   0
1   1    0   0   0
2   0    1   1   0
3   1    0   1   1

我基本上想找出谁在同一行中的值为 1,然后计算他们都为 1 的行数。因此,例如,brian 和 joe 两次在同一行(第 0 行和第 3 行),因此他们的总分将为 2。我想到的第一种方法是创建字典。我想我会做类似 {brian: 0, 1, 3} 的事情,然后 compare/count 相似之处。由于我在多级索引方面遇到问题,因此无法正常工作。

然后我想到了可能 reshaping/melting dataframe 来解决问题。

我在想一个看起来像这样的 df(显示第 1 行的片段基本上融化了):

0   brian    steve   1   0
1   brian    joe     1   1
2   brian    tom     1   0
3   steve    brian   0   1
4   steve    joe     0   1
5   steve    tom     0   0
...

我的思考方式正确吗?我尝试使用 pd.melt 的许多不同变体,但无法得到我想要的。我缺少什么简单的东西吗?尝试将数据框重塑为我想要解决的问题会造成很多挫败感,因此我们将不胜感激

矩阵乘法应该可以,不是吗?或者比这更复杂?

In [37]: df
Out[37]: 
   brian  steve  joe  tom
0      1      0    1    0
1      1      0    0    0
2      0      1    1    0
3      1      0    1    1

In [38]: df.T.dot(df)
Out[38]: 
       brian  steve  joe  tom
brian      3      0    2    1
steve      0      1    1    0
joe        2      1    3    1
tom        1      0    1    1

编辑:

谢谢@exp1orer

In [40]: df2 = df.T.dot(df)

In [41]: df3 = df2.stack().reset_index()

In [42]: df3[df3.level_0 != df3.level_1]
Out[42]: 
   level_0 level_1  0
1    brian   steve  0
2    brian     joe  2
3    brian     tom  1
4    steve   brian  0
6    steve     joe  1
7    steve     tom  0
8      joe   brian  2
9      joe   steve  1
11     joe     tom  1
12     tom   brian  1
13     tom   steve  0
14     tom     joe  1