2017-08-30 74 views
2

我有这样Python的大熊猫:特定列的每个实例创建新列值

---------------- 
RecID| A |B 
---------------- 
1 |Dog | x 
2 |Dog | y 
3 |Dog | z 
4 |Cat | a 
5 |Cat | b 

数据帧,想知道是否有无论如何改造,以便它是这样的:

----------------------------- 
RecID| A |B_1|B_2|B_3| 
----------------------------- 
1 |Dog| x | y | z | 
2 |Cat| a | b | NA| 

基本上创建B的每个可能值的新列,按A的特定值分组,并填充NA(如果需要)。

回答

3

一种方法是

In [294]: (df.groupby('A', sort=False).B.apply(list) 
      .apply(pd.Series).add_prefix('B_').reset_index()) 
Out[294]: 
    A B_0 B_1 B_2 
0 Dog x y z 
1 Cat a b NaN 

或者,

In [320]: (df.groupby('A', sort=False).B.apply(lambda x: pd.Series(x.values)) 
      .unstack().rename(columns=lambda x: 'B_{}'.format(int(x)+1)) 
      .reset_index()) 
Out[320]: 
    A B_1 B_2 B_3 
0 Dog x y  z 
1 Cat a b None 
0

使用​​与groupbycumcount

df.set_index(
    ['A', df.groupby('A').cumcount() + 1] 
).B.unstack().add_prefix('B_').reset_index() 

    A B_1 B_2 B_3 
0 Cat a b None 
1 Dog x y  z 
相关问题