【问题标题】:Cross Tab using conditional sub-populations使用条件子群体的交叉表
【发布时间】:2017-01-19 06:24:56
【问题描述】:

我正在学习如何使用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 和 YES 的概率的估计,而是对 Yes | 的概率的估计。 GREEN(在绿眼睛的情况下是的概率。)

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

【问题讨论】:

  • 您为 Hazel 和 Green 添加了 0。
  • @TedPetrou Urgh,我的大脑在受伤。你能代表我用实际加起来的内容编辑我的问题吗?

标签: python pandas crosstab


【解决方案1】:

假设您的 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 with axis=0 来通过仅对齐索引值来进行除法。

【讨论】:

  • 这似乎工作得很好。你能解释一下每个幻数是如何在这里使用的吗?我需要理解这一点才能将其扩展到更复杂的情况。
  • 已添加说明。如果您还有其他问题,请告诉我。
  • 这很有意义!谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 2017-09-18
  • 2018-10-02
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多