Python 数据透视表,同时保留所有未涉及的列

Python 数据透视表,同时保留所有未涉及的列,python,pandas,dataframe,Python,Pandas,Dataframe,此代码将生成一个非常简单的虚拟数据框,人们在其中填写调查表格: 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?','HasKid

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

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列总是包含相同的信息,因为它只是根据填写调查的人重复信息

最好将dataframe可视化为透视表,如下所示:

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

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

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

您可以使用

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
或者,您可以将一起使用,如下所示:

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

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

如果要压缩表中的行,首先需要确保每个人都可以应用相同的列。例如,如果你没有向Rachel提出“有孩子”的问题,你就不能合理地这样做,除非你包括一个N/a选项

在这之后,按照某个唯一的ID对表进行排序,这样任何重复的人都肯定会在表中彼此相邻

然后遍历这个表,每次你碰到与上一行相同的行时,获取它所拥有的唯一信息,将它添加到该人的原始行中,并删除这个重复。如果整个桌子都这样做了,你应该得到你的枢轴