如何将具有1级索引层次结构的数据帧转换为3级索引层次结构

2022-10-02 02:31:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个平面数据框:

enter image description here

我想把它转换成这样的数据帧:

enter image description here

对于每一个测试(T)对于每一个版本(version),我想将在给定的likert量表上绘制的答案计数(为了演示目的,我将其减少到3个条目)总结为百分比。你知道吗

对于每一个T和Version的组合,整套likert标度值的总和应达到100%。你知道吗

likert = {
    'Agree': 1,
    'Undecided': 2,
    'Disagree': 3,
}

这怎么可能? 谢谢你的帮助!你知道吗


Tags: 数据答案目的版本version绘制条目平面计数百分比总和标度量表likert
1条回答
网友
1楼 ·

可能不是最优雅的解决方案,但我认为这达到了你的目标。假设您的数据帧名为df(我在两个刻度之间随机取样,所以我的df与您描述的不完全相同):

res = df.melt(id_vars=['T', 'Version'], value_vars=['Q1', 'Q2'], value_name='Scale')

这会将数据帧转换为长格式:

#     T Version variable      Scale
# 0   1       A       Q1  Undecided
# 1   1       A       Q1   Disagree
# 2   1       A       Q1  Undecided
# 3   1       A       Q1      Agree

然后您需要计算每个变量组合的大小,可以通过以下方式完成:

res = res.groupby(['T', 'Version', 'Scale', 'variable']).size()

由此产生:

# T  Version  Scale      variable
# 1  A        Agree      Q1          2
#                        Q2          1
#             Disagree   Q2          3
#             Undecided  Q1          2
#    B        Agree      Q1          1

然后,要将Q1Q2移到列中,可以按如下方式取消最后一个索引级别的堆栈:

res = res.unstack(level=-1).fillna(0)

# variable              Q1   Q2
# T Version Scale
# 1 A       Agree      2.0  1.0
#           Disagree   0.0  3.0
#           Undecided  2.0  0.0

最后,要计算前两个索引级别的每个组合的百分比:

res = res.groupby(level=[0, 1]).apply(lambda x: 100. * x / x.sum())

从而得到期望的结果:

# variable                     Q1         Q2
# T Version Scale
# 1 A       Agree       50.000000  25.000000
#           Disagree     0.000000  75.000000
#           Undecided   50.000000   0.000000
#   B       Agree       33.333333   0.000000
#           Disagree    66.666667  66.666667