2016-03-04 106 views
1

循环的我原来问a question在数据科学界:性能与大熊猫

我有格式化如下表所示的表格:

Feature amount ID 
Feat1 2  1 
Feat2 0  1 
Feat3 0  1 
Feat4 1  1 
Feat2 2  2 
Feat4 0  2 
Feat3 0  2 
Feat6 1  2 

比方说,我有200点不同的ID。我想将所有不同的 特征转换为变量并将其转换为观察值,因此我将具有相同ID的 行合并为一行。例如,

Feat1 Feat2 Feat3 Feat4 Feat5 Feat6 ID 
    2  0  0  1 NA NA 1  
NA  2  0  0 NA 1 2  

是否有一种很好的方法可以在Python(熊猫)或R?

这是我得到了答案:

newdata = pd.DataFrame(columns=['ID', 'Location', 'Feat1', 'Feat2', 'Feat3', 'Feat4', 'Feat5', 'Feat6']) 
grouped = data.groupby(['ID', 'Location']) 

for index, (group_name, d) in enumerate(grouped): 
    newdata.loc[index, 'ID'] = group_name[0] 
    newdata.loc[index, 'Location'] = group_name[1] 
    for feature, amount in zip(d['Feature'], d['amount']): 
     newdata.loc[index, feature] = amount 

更多谷歌搜索后,我发现这个question的回答说:

所以尽量避免Python loop for i, row in enumerate(...)完全

我想知道,关于我原来的问题,有没有更高效的方法?

回答

3

我相信这是你所追求的。

>>> df.pivot_table(values='amount', index='ID', columns='Feature') 
Feature Feat1 Feat2 Feat3 Feat4 Feat6 
ID           
1   2  0  0  1 NaN 
2   NaN  2  0  0  1 

根据您的数据和需要,存在变化。例如:

>>> df.pivot_table(values='amount', index='ID', columns='Feature', 
        aggfunc=np.sum, fill_value=0) 
Feature Feat1 Feat2 Feat3 Feat4 Feat6 
ID           
1   2  0  0  1  0 
2   0  2  0  0  1 
+0

感谢您的回复。我删除了位置列,这不是这个问题的一个因素。 – chchannn

+0

工作!感谢熊猫! – chchannn