Пандас векторизованный способ получить счет с помощью условного оператора между двумя кадрами данных - PullRequest
2 голосов
/ 27 июня 2019

У меня есть два кадра данных (с неравными строками, но одинаковыми столбцами), например, следующие:

DataFrame A:

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

DataFrame B:

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

Я хотел бы реализовать векторизованную условную проверку для попарных элементов.

В моем фактическом наборе данных содержится несколько сотен тысяч элементов.Поэтому, если я проверяю поэлементно, использование двойного цикла for потребует как минимум 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

Каким образом я могу пойти по этому поводу?Достаточно просто сравнить один элемент информационного кадра с соответствующим элементом другого информационного кадра.Что меня смущает, так это то, как сравнивать каждый элемент кадра данных с каждым элементом другого кадра данных.

1 Ответ

1 голос
/ 28 июня 2019

Вот функция без итераций, которая (надеюсь) делает то, что вам нужно:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...