我正在努力想办法有效地解决大熊猫中的数据纠缠问题。这是我的熊猫数据框:
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的许多不同变体,但无法得到我想要的东西。我有什么简单的遗失吗?它试图将数据帧重塑为我想要解决的问题,从而引起很多挫折,所以任何帮助都将受到赞赏
答案 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