蟒蛇& pandas:迭代DataFrame两次

时间:2016-03-24 18:32:36

标签: python pandas

对DataFrame的每一行执行mahalanobis计算,其距离指向DataFrame中的每一行。它看起来像这样:

import pandas as pd
from scipy import linalg
from scipy.spatial.distance import mahalanobis
from pprint import pprint

testa = { 'pid': 'testa', 'a': 25, 'b': .455, 'c': .375 }
testb = { 'pid': 'testb', 'a': 22, 'b': .422, 'c': .402 }
testc = { 'pid': 'testc', 'a': 11, 'b': .389, 'c': .391 }

cats = ['a','b','c']
pids = pd.DataFrame([ testa, testb, testc ])
inverse = linalg.inv(pids[cats].cov().values)
distances = { pid: {} for pid in pids['pid'].tolist() }

for i, p in pids.iterrows():
    pid = p['pid']
    others = pids.loc[pids['pid'] != pid]
    for x, other in others.iterrows():
        otherpid = other['pid']
        d = mahalanobis(p[cats], other[cats], inverse) ** 2
        distances[pid][otherpid] = d

pprint(distances)

这对于这里的三个测试用例来说效果很好,但在现实生活中它会在2000-3000行左右运行,并且使用这种方法需要太长时间。我对熊猫比较陌生,我真的更喜欢python到R,所以我想把它清理干净。

如何提高效率?

1 个答案:

答案 0 :(得分:1)

  

对DataFrame的每一行执行mahalanobis计算,其距离指向DataFrame中的每一行。

这基本上是在sklearn.metrics.pairwise.pairwise_distances中解决的,所以很有可能手动更有效地做到这一点。因此,在这种情况下,怎么样

$j('#hide_' + records[i].idOne).parent('.hideEmail').hide().next('.showReserved').show();