Невозможно использовать методы .size () .div () внутри группы панд с лямбда-функцией - PullRequest
0 голосов
/ 03 июля 2019

Я использую следующие строки кода для вычисления условных вероятностей

    variable = 'variable_name'
    probs = df.groupby(variable).size().div(len(df))
    cond_probs = df.groupby([variable, 'has_income']).size().div(len(df)).div(probs, axis=0, level=variable)

Эти результаты приводят к следующему выводу:

    varibale_name         has_income
    (0.999, 2.0]          False          0.756323
                          True           0.243677
    (2.0, 3.0]            False          0.798372
                          True           0.201628
    (3.0, 16.0]           False          0.809635
                          True           0.190365

Я хотел бы добавить дополнительный столбецв качестве размера выборки для каждой группы, но я не могу переписать формулу внутри лямбда-функции, потому что у объекта группы нет тех же методов, что и у объектов, возвращаемых df.groupby () .Пример:

    cond_probs =df.groupby([variable, 'has_income']).apply(lambda x: 
    pd.Series({
        'probs': x.size().div(len(df)).div(probs, axis=0, level=variable),
        'size': x.size()
    }))

Ошибка: TypeError: объект 'numpy.int32' не может быть вызван

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

1 Ответ

2 голосов
/ 03 июля 2019

Когда вы используете apply с groupby, вы получаете не объект группы, а фрагмент данных, соответствующий соответствующей группе. Так что x в вашем случае - это DataFrame, а не GroupBy объект - относитесь к нему так же, как к df.

cond_probs = df.groupby([variable, 'has_income']).apply(lambda x: 
  pd.Series({
    'probs': (len(x) / len(df)) / probs[x.iloc[0][variable]],
    'size': len(x)
  })
)

NB , если вы используете .size в кадре данных, он вернет общее количество ячеек, поэтому он не совпадает с GroupBy.size ( docs )

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