我正在学习如何使用pandas
python库。我尝试的问题可能不是最简单的问题,因为没有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%)
我想要输出的信息不是对GREEN&概率的估计。是,但更确切地说,是|的概率绿色(给予绿眼睛的概率为。)
我意识到我可以手动除以子群总数来得到答案,但我不确定如何除以上面我的眼睛颜色表中的pandas Series
数据来做到这一点单个交叉表。
答案 0 :(得分:2)
假设您的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)。然后我们必须变得棘手,并使用{= 1}}与轴= 0来除以仅对齐索引值。