提问者:小点点

旋转表,同时保留所有未涉及的列


这段代码将生成一个非常简单的虚拟数据框架,人们在其中填写了一个调查表单:

df2 = pd.DataFrame({
    'name':['John','John','John','Rachel','Rachel','Rachel'],
    'gender':['Male','Male','Male','Female','Female','Female'],
    'age':[40,40,40,39,39,39],
    'SurveyQuestion':['Married?','HasKids?','Smokes?','Married?','HasKids?','Smokes?'],
    'answers':['Yes','Yes','No','Yes','No','No']
})

输出如下所示:

由于表的结构方式,每个问题都有自己的行,我们看到前3列总是包含相同的信息,因为它只是根据填写调查的人重复信息。

最好将数据帧可视化为透视表,类似于以下所示:

df2.pivot(index='name',columns='SurveyQuestion',values='answers')

但是,这样做会导致以前的许多列丢失,因为只有一列可以用作索引。

我想知道最直接的方法是什么,不需要额外的重新加入列。


共2个答案

匿名用户

您可以使用df.pivot_table:

In [27]: df2.pivot_table(values='answers', index=['name','gender','age'], columns='SurveyQuestion', aggfunc='first')
Out[27]: 
SurveyQuestion    HasKids? Married? Smokes?
name   gender age                          
John   Male   40       Yes      Yes      No
Rachel Female 39        No      Yes      No

或者,您可以将df.pivotdf.set_index一起使用,如下所示:

In [30]: df = df2.set_index(['name', 'gender', 'age'])
In [32]: df.pivot(index=df.index, columns='SurveyQuestion')['answers']
Out[32]: 
SurveyQuestion    HasKids? Married? Smokes?
name   gender age                          
John   Male   40       Yes      Yes      No
Rachel Female 39        No      Yes      No

匿名用户

我不确定是否有任何现有的算法可以为您做这件事,但我在我的项目中遇到过类似的问题。

如果您试图压缩表中的行,首先需要确保每个人都可以应用相同的列。 例如,如果你没有问“haskids?”,你就不能合理地这样做。 问瑞秋一个问题,除非你包括一个N/A选项。

在此之后,按某个唯一的ID对表进行排序,这样任何重复的人都将在表中彼此紧挨着。

然后遍历该表,每次点击与上一个相同的行时,获取它所具有的任何唯一信息,将其添加到该人员的原始行中,并删除此重复。 如果这是针对整个表完成的,那么您应该得到您的枢轴。