6

我正在利用 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'])

我想从这个输入计算另一个矩阵,它将每一行与所有其他行进行比较。例如,假设计算是一个查找交集长度的函数,我想要一个输出 DataFrame,len(intersection(Alice,Bob))第一行有 , len(intersection(Alice,Carol))len(intersection(Alice,Dave))每一行都遵循这种格式。使用此示例输入,输出矩阵将为 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 中这种基于函数的计算是否有命名方法?实现这一目标的最有效方法是什么?

4

2 回答 2

7

我不知道命名方法,但我有一个单行。

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
于 2013-06-04T18:07:28.583 回答
1

@Dan Allan 解决方案是“正确的”,这是解决问题的一种略有不同的方法

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
于 2013-06-04T18:16:27.340 回答