2014-02-13 33 views
0

,我有以下數據集:如何採取多行並轉換其中的一些成列

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]) 

回答

1

數據透視表應該做的伎倆。

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