使用条件子群体交叉制表符

时间:2017-01-18 22:03:23

标签: python pandas crosstab

我正在学习如何使用pandas python库。我尝试的问题可能不是最简单的问题,因为没有pandas之前的经验,也没有任何统计语言,例如Stata

假设我有一个关于人们对馅饼和蛋糕的感受的查询数据集。我提出的大部分问题都是以下形式:

  

"你喜欢馅饼而非蛋糕吗?"或者"你会投票给2020年美国总统的樱桃派吗?"

这些导致"是"或"否"答案。

假设我有1000个人已回复,但他们对我即将进行的分析有一些区别,例如GenderEye-Colorprimary-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%)

我想要输出的信息不是对GREEN&概率的估计。是,但更确切地说,是|的概率绿色(给予绿眼睛的概率为。)

我意识到我可以手动除以子群总数来得到答案,但我不确定如何除以上面我的眼睛颜色表中的pandas Series数据来做到这一点单个交叉表。

1 个答案:

答案 0 :(得分: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)。然后我们必须变得棘手,并使用{= 1}}与轴= 0来除以仅对齐索引值。