получение совместной вероятности из фрейма данных pd

#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. Потрясающе! Если бы это сработало для вас, не могли бы вы выбрать этот ответ как правильный, чтобы другие пользователи, у которых такой же / похожий вопрос, могли быстро найти решение?