Написание пользовательской функции для группового столбца - PullRequest
0 голосов
/ 10 октября 2018

Попытка написать следующую пользовательскую функцию groupby для подсчета процентов 1 в заданном двоичном столбце, b:

def _get_perc(ds):
    try: 
        return ds.value_counts(normalize=True).loc[1]
    except KeyError: 
        return 0.0
df[['group','b']].groupby('group').apply(_get_perc)

Но pandas принимает ds в качестве кадра данных вместо Series;он дает мне AttributeError: у объекта 'DataFrame' нет атрибута 'value_counts'.

Как мне написать функцию, которая будет принимать ds в качестве Series?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Укажите, что группировка должна выполняться явно для столбца b.

df
   group  b
0      1  0
1      1  1
2      2  0
3      2  0
4      2  1

df.groupby('group')['b'].apply(_get_perc)
group
1    0.500000
2    0.333333
Name: b, dtype: float64

Этап предварительного индексирования не требуется.


В качестве альтернативы, value_counts также может быть вызван непосредственно на Series:

df.groupby('group')['b'].value_counts(normalize=True).xs(1, level=1, axis=0)

group
1    0.500000
2    0.333333
Name: b, dtype: float64

Дополнительный шаг xs состоит в выборе нормализованных значений 1 с.

0 голосов
/ 10 октября 2018

Просто индексируйте объект GroupBy меткой серии:

def _get_perc(ds):
    try: 
        return ds.value_counts(normalize=True).loc[1]
    except KeyError: 
        return 0.0

df[['group','b']].groupby('group')['b'].apply(_get_perc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...