Посчитайте, сколько строк в одной группе имеют большее значение в данном столбце для каждой строки в Pandas DataFrame - PullRequest
3 голосов
/ 28 сентября 2019

У меня есть фрейм данных pandas с групповым полем и интересующей переменной.Для каждой строки в кадре данных я хочу подсчитать, сколько строк в одной и той же группе имеют большее значение для интересующей переменной.

Ниже приведен пример того, чего я пытаюсь достичь:

import pandas as pd
df = pd.DataFrame(data = [['a',1],['a',2],['a',2],['a',3],['b',4],['b',2],['b',6]],
                  columns = ['groups','value'])
df
  groups value
0   a      1
1   a      2
2   a      2
3   a      3
4   b      4
5   b      2
6   b      6

Вот результат, который я надеюсь получить:

  groups value what_i_want
0   a      1        3
1   a      2        1
2   a      2        1
3   a      3        0
4   b      4        1
5   b      2        2
6   b      6        0

Я знаю, что могу получить этот ответ, просматривая каждую строку кадра данных, однако я также знаю, что итерациячерез ряды данных - последнее средство, и мой полный набор данных намного больше, и это займет много времени.Я предполагаю, что есть какой-то способ сделать это с помощью группового или применения, но я не могу понять это.

Спасибо!

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

IIUC rank

(-df.value).groupby(df['groups']).rank(method='min')-1
Out[466]: 
0    3.0
1    1.0
2    1.0
3    0.0
4    1.0
5    2.0
6    0.0
Name: value, dtype: float64

#df['what i want']=(-df.value).groupby(df['groups']).rank(method='min')-1
1 голос
/ 28 сентября 2019

Использование бесшумного вещания для каждой группы:

def summarize(group):
    v = group['value'].values
    other = v[:, None]
    count = (other > v).sum(axis=0)

    return pd.DataFrame({'what_i_want': count})

df.groupby('groups').apply(summarize)

Пояснение

Давайте рассмотрим группу a.Сначала мы извлекаем элементы в values в массив с именем v:

v = [1, 2, 2, 3] # ndarray of shape (4,)

Мы хотим сравнить этот массив с самим собой ортогонально и посчитать, сколько элементов больше, чем текущий элемент.Синтаксис [:, None] заключается в увеличении v дополнительного измерения ...

other = [[1], [2], [2], [3]] # ndarray of shape (4,1)

... так, чтобы операция other > v была транслируемой и матрица сравнения выглядела следующим образом:

other > v
            v:  [ 1   2   2   3 ]
other:  [
         [1]      F   F   F   F
         [2]      T   F   F   F
         [2]      T   F   F   F
         [3]      T   T   T   F
        ]
----------------------------------
sum(axis=0)       3   1   1   0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...