熊猫使用两个数据帧之间的条件语句进行计数的矢量化方法

时间:2019-06-27 20:23:47

标签: python pandas numpy

我有两个数据框(行数不等,但列数相同),如下所示。

DataFrame A:


var myDropzone = new Dropzone('.dropzone', {
    //...
    headers: {
        'Authorization': authorizationHeader,
        // remove Cache-Control and X-Requested-With
        // to be sent along with the request
        'Cache-Control': null,
        'X-Requested-With': null
    }
});

DataFrame B:

dummy | probability
-------------------
  0   |    .1
-------------------
  0   |    .2

我想做的是对成对元素实施矢量化条件检查。

我的实际数据集有几十万个元素。因此,如果我明智地检查元素,则使用double for循环将至少需要100000 ^ 2次迭代,而我根本不希望这样做。

我相信可能有一种方法可以使用我目前不知道的numpy和pandas。

伪代码应如下所示:

dummy | probability
-------------------  
  1   |    .05
-------------------
  1   |    .2

对于上面的测试示例,我们有:

def vectorized_counts():

    A = 0
    B = 0
    tie = 0

    if element in dfA second column > element in dfB second column:
        A += 1
    elif element in dfA second column < element in dfB second column:
        B += 1
    else:
        tie += 1

    return list(A,B,tie)

因此:

A
.1 > .05
.2 > .05

B
.1 < .2

tie
.2 = .2

我该怎么办?将一个数据帧的一个元素与另一个数据帧的对应元素进行比较就足够简单了。令我困惑的是如何比较一个数据框的每个元素和另一个数据框的每个元素。

1 个答案:

答案 0 :(得分:1)

这是一个无迭代功能,可以(希望)完成您需要的操作:

def compare_probabilities(A, B):
    df = pd.concat([A] * B.shape[0], axis=0).reset_index(drop=True)
    df['Ap'] = df.probability
    df['Bp'] = B.probability.repeat(A.shape[0]).values
    AgtB = (df.Ap > df.Bp).sum()
    BgtA = (df.Ap < df.Bp).sum()
    #AeqB = (df.Ap == df.Bp).sum()
    AeqB = df.shape[0] - (AgtB + BgtA)
    return AgtB, BgtA, AeqB

A = pd.DataFrame({'dummy':[0,0], 'probability':[0.1,0.2]})
B = pd.DataFrame({'dummy':[1,1], 'probability':[0.05,0.2]})
print ("compare_probabilities: A>B is %d; B>A is %d;  A==B is %d"%compare_probabilities(A, B))

应显示:

compare_probabilities: A>B is 2; B>A is 1; A==B is 1

它应该适用于A和B中不相等的行大小。