Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找数据帧行中的相似性_Python_Pandas - Fatal编程技术网

Python 查找数据帧行中的相似性

Python 查找数据帧行中的相似性,python,pandas,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}的事情,然后

我正在努力想办法有效地解决熊猫的数据纠纷问题。这是我的熊猫数据框:

 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行的片段):


我这样想对吗?我尝试使用了很多不同的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

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

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

美好的为了匹配OP所需的输出,您可以对名称进行
堆栈
重置索引
,然后删除两个名称相同的行。这真的很有帮助,我想得太多了,看起来很像!为了匹配OP所需的输出,您可以对名称进行
堆栈
重置索引
,然后删除两个名称相同的行。这真的很有帮助,我想得太多了