Python 将一列与包含无循环的分类值的多列进行比较
我试图将numpy数据集中的一些列与包含分类数据的另一组列进行比较: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
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查看最后一次编辑。希望这有意义!我知道我在推动它一点,但无论如何,不使用循环做它,因为你有上面?无论如何,我会在上面打勾,但我只是对消除循环非常好奇。