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

Python 将一列与包含无循环的分类值的多列进行比较,python,pandas,numpy,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

我试图将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()
计算所有分类值,它给出了一个完整的列表。但是,我一直在思考如何使用UFUNC、广播、掩蔽等创建矩阵,以便在不使用循环的情况下将这些列与分类值进行比较

理想情况下,输出应该是一个矩阵,其中包含一列中可用的所有类别,以及其他列中的关联方法

            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
支点和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)

你能编辑你的问题来添加所需的输出吗?与其写这么多,不如向我们展示你的代码和预期输出这是一个
numpy
数组还是
pandas
dataframe?我使用一个循环来检查所有分类值,然后使用另一个循环将它们与每列进行比较。这显然是一个缓慢的解决方案。我没有关于无循环解决方案的任何代码,因为numpy对我来说是新的,我不知道如何编写无循环的代码!我对抽象的解决方案比对具体的更感兴趣。谢谢!在没有明确使用性别和等级的情况下写这篇文章有什么意义吗?没有明确使用性别和等级是什么意思?使用他们的指数?这就是你想要的,没错,这正是重点!但是,假设我的数据集包含x个以上的列,每个列都有更多的分类变量。不同数据集中的X值不同,因此我无法明确定义性别或等级(因为在不同的数据集中,它可能是颜色、血型和其他一些分类变量)。我只能用np.unique()提取它们,然后用上面的代码循环它们。有没有一种方法可以在没有循环的情况下输入它们?我希望这是清楚的。@jazz090查看最后一次编辑。希望这有意义!我知道我在推动它一点,但无论如何,不使用循环做它,因为你有上面?无论如何,我会在上面打勾,但我只是对消除循环非常好奇。