#python #pandas #dataframe #filtering #probability
#python #панды #фрейм данных #фильтрация #вероятность
Вопрос:
У меня есть следующий фрейм данных
{'state': {7192: 'healthy',
7193: 'healthy',
7194: 'healthy',
7195: 'Non healthy',
7196: 'Non healthy'},
'type': {7192: 'W', 7193: 'A', 7194: 'W', 7195: 'W', 7196: 'A'}}
Я хотел бы иметь совместную вероятность, связанную с этим df.
P (Состояние = исправно, тип = A), P (Состояние = исправно, тип = W) P (Состояние = Не исправно, тип = A), P (Состояние = не исправно, тип = W)
Я пытался использовать метод groupby, но он не сработал. Каков наиболее эффективный способ сделать это.
РЕДАКТИРОВАТЬ: чтобы немного прояснить, я хочу подсчитать вхождение каждой пары (состояние, тип). В приведенном выше примере это должно быть P (состояние = исправно, тип = A) = 1/5, P (Состояние = исправно, тип = W) = 2/5 P (Состояние = Не исправно, тип = A) = 1/5, P (состояние = не исправно, тип = W) = 1/5
Спасибо,
Комментарии:
1. Можете ли вы подробнее рассказать о совместной вероятности? Что именно вы хотите сделать?
2. Для этого вы можете использовать prob140
Ответ №1:
Похоже, вы можете использовать DataFrame.value_counts(normalize=True)
для достижения того, чего хотите. Обратите внимание, что это DataFrame.value_counts
новое для pandas
> = 1.1.0. Если вы используете более старую версию, вы можете достичь того же результата другим методом.
Сначала преобразуйте свой словарь в pd.DataFrame
:
df = pd.DataFrame(data)
Версия Pandas > = 1.1.0
probs = df.value_counts(["state", "type"], normalize=True)
print(probs)
healthy W 0.4
A 0.2
Non healthy W 0.2
A 0.2
# Select individual probabilitiy:
healthy_a_prob = probs[("healthy", "A")]
print(healthy_a_prob)
0.2
Если ваш pandas старше 1.1.0, замените первую строку в приведенном выше примере на:
probs = df.groupby("state")["type"].value_counts() / len(df)
# rest is the exact same
Если вам нужна таблица вероятностей с перекрестной таблицей, я бы рекомендовал использовать pd.crosstab
with normalize=True
:
crosstab_ptable = pd.crosstab(df["state"], df["type"], normalize=True)
print(crosstab_ptable)
type A W
state
Non healthy 0.2 0.2
healthy 0.2 0.4
Если вас также интересуют предельные вероятности, вы можете использовать margins
аргумент:
crosstab_ptable = pd.crosstab(df["state"], df["type"], margins=True, normalize=True)
print(crosstab_ptable)
type A W All
state
Non healthy 0.2 0.2 0.4
healthy 0.2 0.4 0.6
All 0.4 0.6 1.0
Комментарии:
1. Большое спасибо, что у вас была старая версия pandas!
2. Потрясающе! Если бы это сработало для вас, не могли бы вы выбрать этот ответ как правильный, чтобы другие пользователи, у которых такой же / похожий вопрос, могли быстро найти решение?