2017-01-18 9 views
0

Я изучаю, как использовать библиотеку python pandas. Я пытаюсь решить проблему, которая, вероятно, не самая простая вещь, которой не было получено никакого опыта с pandas, ни какой-либо статистический язык, такой как Stata.Перекрестная вкладка с использованием условных подгрупп

Предположим, у меня есть набор данных из запроса о чувствах людей к пирогам и пирожным. Большинство вопросов, которые я задал, имеют следующий вид:

«Вы предпочитаете пироги с пирожными?» или «Вы проголосуете за вишневый пирог для президента Соединенных Штатов в 2020 году?»

Это приводит к ответам «Да» или «Нет».

Предположим, у меня есть 1000 людей, которые ответили, но у них есть некоторые различия, которые важны для моего предстоящего анализа, как Gender, Eye-Color и primary-hand-use (правый/левый/симметричная). Также предположим, что у меня есть сотни этих различий и что в конечном итоге я хочу сравнить их все с одним и тем же вопросом.

Теперь из моего cake-pie.DTA файла я могу запустить:

frame = pandas.read_stata("cake-pie.DTA") 
answers = ["Yes", "No"] 
pandas.crosstab(frame["Question_1", frame["Eye_Color"]], answers, normalize="columns") 

И это даст мне следующее:

col_0   yes 
col_1   no 
Question_1 eye_color 
Yes Blue 0.1500 
    Hazel 0.050 
    Brown 0.2100 
    Green 0.050 
No Blue 0.2850 
    Hazel 0.0000 
    Brown 0.2450 
    Green 0.010 

Однако мои 1000 людей, которые откликнулись не из равных пропорций каждого цвета глаз. Возможно, мое население выглядит следующим образом:

Blue 435 (43.5%) 
Hazel 50 (5.0%) 
Brown 455 (45.5%) 
Green 60 (6.0%) 

Информация, которую я хотел бы иметь выход не является оценка вероятности ЗЕЛЕНЫЙ & ДА, а скорее, вероятность Да | ЗЕЛЕНЫЙ (вероятность да дается зеленым глазам.)

Я понимаю, что я могу разделить вручную по сумме субпопуляции, чтобы получить этот ответ, но я не уверен, как разделить на pandas Series данные, которые являются моей таблицей глазного цвета выше для этого в одной перекрестной вкладке.

+1

Вы добавили 0 для Hazel и Green. –

+0

@TedPetrou Урх, у меня мозг болит. Не могли бы вы изменить мой вопрос от моего имени, что на самом деле складывается? – BlackVegetable

ответ

2

Предполагая, что ваш DataFrame выглядит как изображение ниже, вы поворачиваете его, откладывая и разделяя каждую строку на общую сумму.

enter image description here

df1 = df.unstack(0) 
df1.div(df1.sum(1), axis=0) 

     eye_color   
      No  Yes 
Blue 0.655172 0.344828 
Brown 0.538462 0.461538 
Green 0.166667 0.833333 
Hazel 0.000000 1.000000 

Больше объяснения. unstack(0) поворачивает внешний уровень (уровни с нулевым индексом начинаются слева) от индекса до столбца, поэтому вы получаете следующий кадр.

enter image description here

.sum(1) суммы каждой строки. По умолчанию так суммируются столбцы (ось = 0). Затем мы должны быть сложными и использовать .div с осью = 0, чтобы разделить, выровняв только значения индекса.

+0

Это, кажется, работает достаточно хорошо. Не могли бы вы объяснить, как здесь используется каждое магическое число? Мне нужно будет понять, что для того, чтобы распространить это на более сложные ситуации. – BlackVegetable

+0

Пояснение добавлено. Дайте мне знать, если у вас появятся дополнительные вопросы. –

+0

Это имеет смысл! Спасибо. – BlackVegetable