Сгруппируйте по столбцу, рассчитайте количество вхождений значения в другой столбец и разделите эти числа - PullRequest
0 голосов
/ 05 июня 2018

У меня есть DataFrame, который выглядит следующим образом:

data = pd.DataFrame({'id' : ['a1', 'a1', 'a1', 'a2','a2','a3','a3','a3'], 
                     'label' : ['0','0','1','0','1','0','1','1']})

Моя цель - сгруппировать по id и выполнить некоторую арифметику: вычислить число вхождений '0'и «1» в каждой группе, добавьте 1000 к каждому номеру и, наконец, разделите эти числа друг на друга.Например, для группы «a1»: «0» встречается дважды, «1» встречается один раз, затем 2 * 1000/1 * 1000 = 2.

Нужный кадр данных должен выглядеть следующим образом:

id number
a1 2
a2 1
a3 0,5

Эти вопросы SO мне очень помогли:

Сгруппируйте по двум столбцам и посчитайте вхождения каждой комбинации в пандах

pandas groupbyсчитать строку вхождения над столбцом

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

Ответы [ 3 ]

0 голосов
/ 05 июня 2018
data.groupby('id').label.apply(lambda x: (x == '0').sum()/(x == '1').sum())

Выход:

id
a1    2.0
a2    1.0
a3    0.5
Name: label, dtype: float64
0 голосов
/ 05 июня 2018

Вы можете использовать collections.Counter и явно определить требуемый результат, если в вашей группе нет значения 1.

from collections import Counter

def calculator(x):
    c = Counter(x)
    try:
        return c['0'] / c['1']
    except ZeroDivisionError:
        return np.nan

res = data.groupby('id')['label'].apply(calculator)

id
a1    2.0
a2    1.0
a3    0.5
Name: label, dtype: float64
0 голосов
/ 05 июня 2018

groupby затем value_counts, и мы делаем pct_change

data.groupby('id').label.apply(lambda x : x.value_counts(sort=False).pct_change()+1).dropna().reset_index(level=0)
Out[405]: 
   id  label
0  a1    2.0
0  a2    1.0
0  a3    0.5

или

pd.crosstab(data.id,data.label).assign(v=lambda x : x['0']/x['1'])
Out[414]: 
label  0  1    v
id              
a1     2  1  2.0
a2     1  1  1.0
a3     1  2  0.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...