成对相似

时间:2019-01-27 05:35:48

标签: python pandas

我有一个如下所示的pandas数据框:

df = pd.DataFrame({'name': [0, 1, 2, 3], 'cards': [['A', 'B', 'C', 'D'],
                                                   ['B', 'C', 'D', 'E'],
                                                   ['E', 'F', 'G', 'H'],
                                                   ['A', 'A', 'E', 'F']]})

name    cards
0       ['A', 'B', 'C', 'D']
1       ['B', 'C', 'D', 'E']
2       ['E', 'F', 'G', 'H']
3       ['A', 'A', 'E', 'F']

我想创建一个看起来像这样的矩阵:

    name  0    1    2    3
name
0         4    3    0    1
1         3    4    1    1
2         0    1    4    2
3         1    1    2    4

其中的值是共有项目的数量。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

通过列表理解并遍历所有对,我们可以得出结果:

import pandas as pd
df = pd.DataFrame({'name': [0, 1, 2, 3], 'cards': [['A', 'B', 'C', 'D'],
                                               ['B', 'C', 'D', 'E'],
                                               ['E', 'F', 'G', 'H'],
                                               ['A', 'A', 'E', 'F']]})
result=[[len(list(set(x) & set(y))) for x in df['cards']] for y in  df['cards']]


print(result)

输出:

[[4, 3, 0, 1], [3, 4, 1, 1], [0, 1, 4, 2], [1, 1, 2, 3]]

'&'用于计算两个集合的交集

这正是您想要的:

import pandas as pd
df = pd.DataFrame({'name': [0, 1, 2, 3], 'cards': [['A', 'B', 'C', 'D'],
                                                    ['B', 'C', 'D', 'E'],
                                                    ['E', 'F', 'G', 'H'],
                                                    ['A', 'A', 'E', 'F']]})
result=[[len(x)-max(len(set(y) -  set(x)),len(set(x) -  set(y))) for x in df['cards']] for y in  df['cards']]


print(result)

输出:

[[4, 3, 0, 1], [3, 4, 1, 1], [0, 1, 4, 2], [1, 1, 2, 4]]

答案 1 :(得分:1)

使用.apply方法和lambda,我们可以直接获取数据框

def func(df, j):
    return pd.Series([len(set(i)&set(j)) for i in df.cards])

newdf = df.cards.apply(lambda x: func(df, x))
newdf

    0   1   2   3
0   4   3   0   1
1   3   4   1   1
2   0   1   4   2
3   1   1   2   3

答案 2 :(得分:0)

import pandas as pd
import numpy as np


df = pd.DataFrame([['A', 'B', 'C', 'D'],
                   ['B', 'C', 'D', 'E'],
                   ['E', 'F', 'G', 'H'],
                   ['A', 'A', 'E', 'F']])


nrows = df.shape[0]
# Initialization
matrix = np.zeros((nrows,nrows),dtype= np.int64)


for i in range(0,nrows):
    for j in range(0,nrows):
        matrix[i,j] = sum(df.iloc[:,i] == df.iloc[:,j])

输出

print(matrix)

[[4 1 0 0]
 [1 4 0 0]
 [0 0 4 0]
 [0 0 0 4]]