在pandas数据帧的行中查找相似之处

时间:2015-02-13 19:03:22

标签: python 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}这样的事情然后比较/计算相似之处。由于我遇到了多级索引问题,因此无法解决此问题。

然后,我认为可能会重塑/融化数据帧以解决问题。

我在想一个看起来像这样的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的许多不同变体,但无法得到我想要的东西。我有什么简单的遗失吗?它试图将数据帧重塑为我想要解决的问题,从而引起很多挫折,所以任何帮助都将受到赞赏

1 个答案:

答案 0 :(得分:4)

矩阵乘法应该做,不是吗?或者它比那更复杂?

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