将一列与包含不带循环的分类值的多列进行比较

时间:2018-01-02 13:17:51

标签: python pandas numpy

我正在尝试将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

1 个答案:

答案 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)