我正在尝试将numpy数据集上的某些列与包含分类数据的另一组列进行比较:
Gender | Grade | Score 1 | Score 2 | Score 3
M | A | 12 | 8 | 0
M | A | 8 | 11 | 4
M | B | 10 | 8 | 9
F | B | 12 | 2 | 2
F | B | 11 | 8 | 1
F | B | 1 | 4 | 2
我需要做的是将每个得分列与性别和成绩进行比较。然后计算每个类别的平均分数。例如,分数1中具有性别M和性别F均值的平均值,A级均值和B级均值。我无法在代码中明确定义类别(或性别和成绩列名称)作为我的实际数据集具有分类值的可变分布,一些具有分类数据的附加列。我能够使用np.unique()
计算所有分类值,并给出完整列表。但是,我不知道如何使用ufuncs,广播,屏蔽等创建矩阵,这样我就可以将这些列中的每一列与没有循环的分类值进行比较。
输出理想情况下应该是一个矩阵,其中包含一列中可用的所有类别,以及来自其他列的相关方法。
A B M F
Score1 mean(S1,A) mean(S1,B) mean(S1, M) mean(S1, F)
Score2 mean(S2,A) etc etc etc
Score3 mean(S3,A) etc etc etc
答案 0 :(得分:2)
枢轴和concat,即
one = df.pivot_table(columns=['Gender'],aggfunc='mean')
two = df.pivot_table(columns=['Grade'],aggfunc='mean')
main = pd.concat([one,two],1)
F M A B
Score 1 8.000000 10.000000 10.0 8.5
Score 2 4.666667 9.000000 9.5 5.5
Score 3 1.666667 4.333333 2.0 3.5
如果您想要一个单行解决方案,那么:
main = pd.concat([df.pivot_table(columns=i) for i in ['Grade','Gender']],1) # By default `aggfunc` is mean
好吧,如果你只希望分数为索引而其余分数为列:
cols = df.columns[~df.columns.str.contains('Score')]
# Index(['Gender', 'Grade'], dtype='object')
ndf = pd.concat([df.pivot_table(columns=i) for i in cols],1)