Python 如何获取多行并将其中一些行转换为列

Python 如何获取多行并将其中一些行转换为列,python,pandas,dataset,Python,Pandas,Dataset,我有以下数据集: QuestionID RowID ColID MenuID SourceRowID SourceColumnID SourceVariationID ResponseCount ---------- ---------- ---------- ------ ----------- -------------- ----------------- ------------- 316923119 3029903189 3

我有以下数据集:

QuestionID  RowID       ColID       MenuID  SourceRowID  SourceColumnID  SourceVariationID  ResponseCount  
----------  ----------  ----------  ------  -----------  --------------  -----------------  -------------  
316923119   3029903189  3029903193  0       3029903177   3029903181      0                  773            
316923119   3029903189  3029903193  0       3029903177   3029903182      0                  788            
316923119   3029903189  3029903193  0       3029903177   3029903183      0                  778            
316923119   3029903189  3029903193  0       3029903177   3029903184      0                  803            
316923119   3029903189  3029903194  0       3029903177   3029903181      0                  766            
316923119   3029903189  3029903194  0       3029903177   3029903182      0                  799            
316923119   3029903189  3029903194  0       3029903177   3029903183      0                  782
316923119   3029903189  3029903194  0       3029903177   3029903184      0                  773
我想将其转换为此数据集:

QuestionID  RowID       ColumnID    MenuID  3029903181  3029903182  3029903183  3029903184  ResponseCount  
----------  ----------  ----------  ------  -------     -------     -------      -------    -------------         
316923119   3029903189  3029903193   0        773        788          778         803          3142          
316923119   3029903189  3029903194   0        766        799          782         773          3120  
这些在Python中表示为:

 [
  {
    'QuestionID': 316923119, 
    'RowID': 3029903189, 
    'ColID': 3029903193, 
    'SourceColumnID': 3029903181,
    'ResponseCount': 773
  },
  {
    'QuestionID': 316923119, 
    'RowID': 3029903189, 
    'ColID': 3029903193, 
    'SourceColumnID': 3029903182,
    'ResponseCount': 788
  },
  {
    'QuestionID': 316923119, 
    'RowID': 3029903189, 
    'ColID': 3029903193, 
    'SourceColumnID': 3029903183,
    'ResponseCount': 778
  },
  {
    'QuestionID': 316923119, 
    'RowID': 3029903189, 
    'ColID': 3029903193, 
    'SourceColumnID': 3029903184,
    'ResponseCount': 803
  },
  {
    'QuestionID': 316923119, 
    'RowID': 3029903189, 
    'ColID': 3029903194, 
    'SourceColumnID': 3029903181,
    'ResponseCount': 766
  },
  {
    'QuestionID': 316923119, 
    'RowID': 3029903189, 
    'ColID': 3029903194, 
    'SourceColumnID': 3029903182,
    'ResponseCount': 799
  },
  {
    'QuestionID': 316923119, 
    'RowID': 3029903189, 
    'ColID': 3029903194, 
    'SourceColumnID': 3029903183,
    'ResponseCount': 782
  },
  {
    'QuestionID': 316923119, 
    'RowID': 3029903189, 
    'ColID': 3029903194, 
    'SourceColumnID': 3029903184,
    'ResponseCount': 773
  },
]
我想得到:

[
  {
    'QuestionID': 316923119, 
    'RowID': 3029903189, 
    'ColID': 3029903193, 
    '3029903181': 773,
    '3029903182': 788,
    '3029903183': 778,
    '3029903184': 803,
    'ResponseCount': 3142
  },
  {
    'QuestionID': 316923119, 
    'RowID': 3029903189, 
    'ColID': 3029903194, 
    '3029903181': 766,
    '3029903182': 799,
    '3029903183': 782,
    '3029903184': 773,
    'ResponseCount': 3120
  },
]
这里最大的变化是将行SourceColumnID合并到由相同的QuestionID、RowID和ColID分组的列中,然后将它们全部合并到一个新的列ResponseCount中

我更愿意将这些数据加载到pandas中,并使用数据帧进行转换,但欢迎提出任何建议

编辑 下面托马格的答案几乎是正确的:

In [90]: df
Out[90]: 
        ColID  QuestionID  ResponseCount       RowID  SourceColumnID
0  3029903193   316923119            773  3029903189      3029903181
1  3029903193   316923119            788  3029903189      3029903182
2  3029903193   316923119            778  3029903189      3029903183
3  3029903193   316923119            803  3029903189      3029903184
4  3029903194   316923119            766  3029903189      3029903181
5  3029903194   316923119            799  3029903189      3029903182
6  3029903194   316923119            782  3029903189      3029903183
7  3029903194   316923119            773  3029903189      3029903184

[8 rows x 5 columns]

In [91]: counts = df.pivot_table(values='ResponseCount', rows=['ColID', 'QuestionID', 'RowID'], cols='SourceColumnID', aggfunc='sum')

In [92]: counts['ResponseCount'] = counts.sum(1)

In [93]: counts
Out[93]: 
SourceColumnID                    3029903181  3029903182  3029903183  3029903184  ResponseCount
ColID      QuestionID RowID                                                                    
3029903193 316923119  3029903189         773         788         778         803           3142
3029903194 316923119  3029903189         766         799         782         773           3120

[2 rows x 5 columns]
但这不允许我以我需要的方式访问数据,我应该能够获取计数并访问新列以获取它们的计数:

counts[0][3029903181]
应该返回773

我发现这是可行的:

int(counts.iloc[0][3029903181])

数据透视表应该可以做到这一点

In [54]: counts = df.pivot_table(values='ResponseCount',
                                 rows=['ColID', 'QuestionID', 'RowID'],
                                 cols='SourceColumnID', aggfunc='sum')

In [55]: counts
Out[55]: 
SourceColumnID                    3029903181  3029903182  3029903183  \
ColID      QuestionID RowID                                            
3029903193 316923119  3029903189         773         788         778   
3029903194 316923119  3029903189         766         799         782   

SourceColumnID                    3029903184  
ColID      QuestionID RowID                   
3029903193 316923119  3029903189         803  
3029903194 316923119  3029903189         773  

[2 rows x 4 columns]
要获取
ResponseCount
列,您需要对各列进行求和:

In [57]: counts['ResponseCount'] = counts.sum(1)

In [58]: counts
Out[58]: 
SourceColumnID                    3029903181  3029903182  3029903183  \
ColID      QuestionID RowID                                            
3029903193 316923119  3029903189         773         788         778   
3029903194 316923119  3029903189         766         799         782   

SourceColumnID                    3029903184  ResponseCount  
ColID      QuestionID RowID                                  
3029903193 316923119  3029903189         803           3142  
3029903194 316923119  3029903189         773           3120  

[2 rows x 5 columns]

最后,您有一个
MenuID
列。我把它从我的答案中漏掉了,因为你没有具体说明它是如何计算的,以及它是否对每个群体都是唯一的。你可能需要像
df.groupby(['ColID','QuestionID','RowID'])['MenuID']
.sum()
.head(1)
这样的东西。

这几乎满足了我的需要,所以我需要它被表示出来,这样我就可以像第二字典一样访问它,所以如果我计算[0]['302990381']我会把那部分忘了的。很高兴你明白了。