在 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
我正在努力想出一种方法来有效地解决 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