使用条件子群体的交叉表

Cross Tab using conditional sub-populations

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

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

"Do you prefer pies over cakes?" or "Would you vote for a cherry pie for President of the United states in 2020?"

这些导致 "Yes" 或 "No" 个答案。

假设我有 1000 人做出了回应,但他们有一些对我即将进行的分析很重要的区别,例如 GenderEye-Colorprimary-hand-use(right/left/ambidextrous).还假设我有数百个这样的区别,最终我想将它们与同一个问题进行比较。

现在,从我的 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 数据,即我的眼睛颜色 table 在单个交叉表中执行上述操作。

假设您的 DataFrame 看起来像下图,您通过取消堆叠然后将每一行除以其行总数来旋转它。

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) 将索引的最外层(级别从左侧开始索引为零)旋转到一列,以便您获得以下框架。

.sum(1) 对每一行求和。默认值是对列求和(轴 = 0)。然后我们必须巧妙地使用 .div 和 axis=0 来通过仅对齐索引值来划分。