我正在利用pandas创建一个如下所示的数据框:
ratings = pandas.DataFrame({
'article_a':[1,1,0,0],
'article_b':[1,0,0,0],
'article_c':[1,0,0,0],
'article_d':[0,0,0,1],
'article_e':[0,0,0,1]
},index=['Alice','Bob','Carol','Dave'])
我想从这个输入计算另一个矩阵,它将每行与所有其他行进行比较。让我们假设例如计算是一个找到交集的长度的函数,我想在第一行中输出len(intersection(Alice,Bob))
,len(intersection(Alice,Carol))
,len(intersection(Alice,Dave))
的输出DataFrame,遵循该格式的每一行与其他行。使用此示例输入,输出矩阵将为4x3:
len(intersection(Alice,Bob)),len(intersection(Alice,Carol)),len(intersection(Alice,Dave))
len(intersection(Bob,Alice)),len(intersection(Bob,Carol)),len(intersection(Bob,Dave))
len(intersection(Carol,Alice)),len(intersection(Carol,Bob)),len(intersection(Carol,Dave))
len(intersection(Dave,Alice)),len(intersection(Dave,Bob)),len(intersection(Dave,Carol))
在pandas中有这种基于函数的计算的命名方法吗?什么是最有效的方法来实现这一目标?
答案 0 :(得分:5)
我不知道一个命名的方法,但我有一个单行。
In [21]: ratings.apply(lambda row: ratings.apply(
... lambda x: np.equal(row, x), 1).sum(1), 1)
Out[21]:
Alice Bob Carol Dave
Alice 5 3 2 0
Bob 3 5 4 2
Carol 2 4 5 3
Dave 0 2 3 5
答案 1 :(得分:1)
In [26]: ratings
Out[26]:
article_a article_b article_c article_d article_e
Alice 1 1 1 0 0
Bob 1 0 0 0 0
Carol 0 0 0 0 0
Dave 0 0 0 1 1
In [27]: ratings.apply(lambda x: (ratings.T.sub(x,'index')).sum(),1)
Out[27]:
Alice Bob Carol Dave
Alice 0 -2 -3 -1
Bob 2 0 -1 1
Carol 3 1 0 2
Dave 1 -1 -2 0