Python 3.x 需要根据列的分组将dataframe行数据转换为列

Python 3.x 需要根据列的分组将dataframe行数据转换为列,python-3.x,pandas,Python 3.x,Pandas,我有一个CSV文件,其中包含用户及其问题和答案,用于在工作申请中预筛选问题。在某些情况下,给定的问题可以有多个答案。以下是CSV当前的外观: User,RequisitionID,Question,Answer user1,190004116,6162,7296 user2,190004086,6115,7260 user2,190004086,6117,7264 user2,190004086,6117,7265 user2,190004086,6117,7268 user2,19000408

我有一个CSV文件,其中包含用户及其问题和答案,用于在工作申请中预筛选问题。在某些情况下,给定的问题可以有多个答案。以下是CSV当前的外观:

User,RequisitionID,Question,Answer
user1,190004116,6162,7296
user2,190004086,6115,7260
user2,190004086,6117,7264
user2,190004086,6117,7265
user2,190004086,6117,7268
user2,190004086,6117,7269
user3,190005321,6321,4221
user3,190005321,6321,4322
与上述格式不同的是,我希望答案数据按用户、requisionid和Question分组在单独的列中(每个问题的列数与不同答案的列数相同),如下所示:

User,RequisitionID,Question,Answer1,Answer2,Answer3,Answer4
user1,190004116,6162,7296,,,
user2,190004086,6115,7260,,,
user2,190004086,6117,7264,7265,7268,7269
user3,190005321,6321,4221,4321,
我试着使用下面的“groupby”,但我只是无法得到我想要的形状的结果数据帧

reqPrscrAnsFileFiltered = reqPrscrAnsFileFiltered.groupby(['User','RequisitionID','Question']).Answer.apply(list)
reqPrscrAnsFileFiltered = pandas.DataFrame(reqPrscrAnsFileFiltered.tolist(), index=reqPrscrAnsFileFiltered.index)
对不起,我对蟒蛇和熊猫还不熟悉,所以任何帮助都会很好

好了,我们就要到了。我实现了您在评论中提供的pivot_表代码片段,但我不确定您对折叠多索引的意思。如果不这样做,Dataframe输出如下所示:

Answer,Answer,Answer,Answer
1,2,3,4
7296.0,,,
7260.0,,,
7264.0,7265.0,7268.0,7269.0
4221.0,4322.0,,  

你能帮助我理解如何使它看起来像我的帖子上面所期望的输出吗?具体来说,我想删除答案索引号为(1,2,3,4)的行,然后在答案列左侧添加缺少的User、requisionid和Question列。抱歉,如果这是基本内容…

这是一个
pivot\u表
问题,在使用
groupby
+
cumcount
定义了一个新列之后,它允许您正确地透视。谢谢,ALollz。我尝试了您的建议,将pivot_表与groupby+cumcount中的新列一起使用,但我仍在努力获得结果数据帧的正确形状。正如我所说,我是Python和Pandas新手,所以这超出了我的知识范围……首先,使用
df['idx']=df.groupby(['User','Question']).cumcount()+1
创建所需的索引。接下来,您将透视:
df=df.pivot_表(index=['User'、'Question'、'requisionid'],columns=['idx'],values=['Answer'])
从这里开始,您应该能够使用这两个副本来折叠列上的多索引,然后您就可以
.reset_index()
@ALollz-我更新了我的帖子,并补充了一些问题。我非常感谢你的帮助,因为我相信这对你来说都是基本的东西(只是对我来说不是)。有了多索引,你就有了一个元组(这里有两个值)。您可以将其组合成一个字符串,其中df.columns=[''.join(map(str,x))表示df.columns中的x]
。然后执行
df=df.reset_index()
,这将把索引(用户、问题、请求ID)中的所有内容移回正常列。这两个步骤应该可以完成所有操作。在使用
groupby
+
cumcount
定义了一个新列之后,这是一个
pivot\u表
问题,它允许您正确地进行透视。谢谢,ALollz。我尝试了您的建议,将pivot_表与groupby+cumcount中的新列一起使用,但我仍在努力获得结果数据帧的正确形状。正如我所说,我是Python和Pandas新手,所以这超出了我的知识范围……首先,使用
df['idx']=df.groupby(['User','Question']).cumcount()+1
创建所需的索引。接下来,您将透视:
df=df.pivot_表(index=['User'、'Question'、'requisionid'],columns=['idx'],values=['Answer'])
从这里开始,您应该能够使用这两个副本来折叠列上的多索引,然后您就可以
.reset_index()
@ALollz-我更新了我的帖子,并补充了一些问题。我非常感谢你的帮助,因为我相信这对你来说都是基本的东西(只是对我来说不是)。有了多索引,你就有了一个元组(这里有两个值)。您可以将其组合成一个字符串,其中df.columns=[''.join(map(str,x))表示df.columns中的x]
。然后执行
df=df.reset_index()
,这将把索引(用户、问题、请求ID)中的所有内容移回正常列。这两个步骤应该可以完成一切。