2017-05-06 38 views
2

我有两种情况,一种是类别标识,另一种是类别值。由于这些值对于不同类别具有不同的含义,因此我想提取这些值以分隔列。因此,例如,我想熊猫将列按组转换为多个

+----+--------+ 
| id | value | 
+----+--------+ 
| 1 |  1 | 
| 1 |  2 | 
| 2 |  1 | 
| 2 |  2 | 
| 3 |  1 | 
| 3 |  2 | 
+----+--------+ 

转换成这样:

+----+---------+---------+---------+ 
| id | value_1 | value_2 | value_3 | 
+----+---------+---------+---------+ 
| 1 |  1 |  0 |  0 | 
| 1 |  2 |  0 |  0 | 
| 2 |  0 |  1 |  0 | 
| 2 |  0 |  2 |  0 | 
| 3 |  0 |  0 |  1 | 
| 3 |  0 |  0 |  2 | 
+----+---------+---------+---------+ 

我敢肯定,我可以做一些numpy的风格操作做到这一点,但我想获得一个更好的把握熊猫,并想以熊猫的方式做到这一点。

我的天真猜测是使用groupby,但我不知道如何从中生成多列。东西沿线

data.groupby('id').agg({'value': something}) 

任何帮助,将不胜感激。

回答

1

可以使用get_dummies()value列相乘:

In [58]: df[['id']] \ 
      .join(pd.get_dummies(df['id']).mul(df['value'], axis=0).add_prefix('value_')) 
Out[58]: 
    id value_1 value_2 value_3 
0 1  1  0  0 
1 1  2  0  0 
2 2  0  1  0 
3 2  0  2  0 
4 3  0  0  1 
5 3  0  0  2 

说明:

In [53]: pd.get_dummies(df['id']) 
Out[53]: 
    1 2 3 
0 1 0 0 
1 1 0 0 
2 0 1 0 
3 0 1 0 
4 0 0 1 
5 0 0 1 


In [52]: pd.get_dummies(df['id']).mul(df['value'], axis=0) 
Out[52]: 
    1 2 3 
0 1 0 0 
1 2 0 0 
2 0 1 0 
3 0 2 0 
4 0 0 1 
5 0 0 2 
+0

是啊,这是伟大的。我在numpy的想法是一样的,但我并不知道这个'mul'方法。非常感谢你! – Pavlin

+0

@Pavlin,欢迎您! – MaxU