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对表进行排序,这样任何重复的人都肯定会在表中彼此相邻 然后遍历这个表,每次你碰到与上一行相同的行时,获取它所拥有的唯一信息,将它添加到该人的原始行中,并删除这个重复。如果整个桌子都这样做了,你应该得到你的枢轴