我将从示例开始,然后分解正在发生的事情。
这是一个示例输入:
数据框:
**Name** **No.** **Test** ***Grade***
Bob 2123320 Math Nan
Joe 2832883 English 90
John 2139300 Science 85
Bob 2123320 History 93
John 2234903 Math 99
希望输出:
**Name** ********2139300********* ********2234903*******
Math English Science Math English Science
John 0 0 85 99 0 0
正如标题所示,我正在尝试应用多个索引。所以基本上它首先查找每个名称,然后对于找到的每个名称查看它有多少个不同的编号。在这种情况下,它将阈值设置为至少 2 个不同的数字(这就是为什么只输出 John 而 Joe/Bob 不输出的原因)。
现在,在每个不同的号码中。我想要搜索特定的测试子集,在本例中只有{数学、英语、科学}。对于每项测试,如果相关人员参加了该测试,则应该有一个等级。我希望为相关测试以及该人未参加的测试输出该成绩。我希望它输出某种简单的标记(即,如果该人当天只参加了数学,则英语和科学输出 0)。
因此,实际上,它首先根据不同号码的数量对人员进行索引,并将其分组。然后它按测试类型对它们进行索引(我只想要其中的一个子集)。它最终会根据每个人参加的测试类型分配一个值,而对于没有参加的测试则简单地输出 0。
这和我之前问的另一个问题类似:Python 中的分组特征矩阵#2-后续 https://stackoverflow.com/questions/49744958/grouped-feature-matrix-in-python-2-follow-up
除了现在我有另一列而不是 1 和 0 之外,其中包含我想要输出的实际值。
谢谢。
编辑:更多样本/输出
**Name** **No.** **Test** ***Grade***
Bob 2123320 Math Nan
Joe 2832883 English 90
John 2139300 Science 85
Bob 2123320 History 93
John 2234903 Math 99
Bob 2932848 English 99
**Name** 2139300 2234903 2123320 2932848
M E S M E S M E S M E S
John 0 0 85 99 0 0 Nan Nan Nan Nan Nan Nan
Bob Nan Nan Nan Nan nan Nan 86 0 0 0 99 0
让我们使用:
将数据框过滤为仅包含您关心的记录
df_out = df[df.groupby(['Name'])['No.'].transform(lambda x: x.nunique() > 1)]
现在,重塑数据框set_index
, unstack
, and reindex
:
df_out.set_index(['Name','No.','Test'])['Grade'].sum(level=[0,1,2])\
.unstack(-1, fill_value=0)\
.reindex(['Math','English','Science'], axis=1, fill_value=0)\
.unstack(-1, fill_value=0).swaplevel(0, 1, axis=1)\
.sort_index(1)
Output:
No. 2123320 2139300 2234903 2932848
Test English Math Science English Math Science English Math Science English Math Science
Name
Bob 0 0 0 0 0 0 0 0 0 99 0 0
John 0 0 0 0 0 85 0 99 0 0 0 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)