如何采取多行并转换其中的一些成列

问题描述:

,我有以下数据集:如何采取多行并转换其中的一些成列

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中。

我宁愿将这些数据加载到熊猫中,并用DataFrame进行转换,但任何建议都是值得欢迎的。

编辑

从TomAugspurger答案几乎以下工作:

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

这几乎工作如何我需要它,所以我需要它被表示,以便我可以像二次字典访问它,所以如果我确实计数[0] ['3029903181']我会得到773 – sontek

+0

哎呀忘了关于那个部分。很高兴你想出来了。 – TomAugspurger