Pandas矢量化的方式使用两个数据范围之间的条件语句获取计数



我有两个dataframes(具有不相等的行,但相同的列(,例如以下内容。

dataframe a:

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

dataframe b:

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

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

我的实际数据集有数十万个元素。因此,如果我明智地检查元素,使用double进行循环需要至少100000^2迭代,我根本不需要。

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

伪代码应该看起来像这样:

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

因此:

A = 2
B = 1
tie = 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。

中的不平等行尺寸

最新更新