2017-08-03 99 views
1

的列组的列我有一个熊猫数据帧,看起来是这样的:基于M列熊猫:重复的行放入名单

>>> df 
     m event 
0  3  1 
1  1  1 
2  1  2 
3  1  2 
4  2  1 
5  2  0 
6  3  1 
7  2  2 
8  3  2 
9  3  1 

我想组的事件列的值转换成列表,以便我会得到这样的:

>>> df 
     m   events 
0  3  [1, 1, 2, 1] 
1  1  [1, 2, 2] 
2  2  [1, 0, 2] 

应该有每m的独特价值一行与属于所有m事件的对应列表。

我尝试这样做:

>>> list(df.groupby('m').event) 
[(3, m_id 
0 1 
6 1 
8 2 
9 1 
Name: event, dtype: int64), (1, m_id 
1 1 
2 2 
3 2 
Name: event, dtype: int64), (2, m_id 
4 1 
5 0 
7 2 
Name: event, dtype: int64)] 

它那种做什么,我想在这M组后的事件。我可以用一些循环来回顾我想要的数据框,但是我觉得我已经开始了一个不必要的复杂路径。如果m有数以千计的唯一值,则会变慢。

我可以使用Pandas方法以优雅的方式执行我想要的转换吗?

如果事件列可以包含(numpy)数组,以便我可以直接在事件行上进行数学运算(如df[df.m==1].events + 100),但常规列表也可以。

回答

2
In [320]: r = df.groupby('m')['event'].apply(np.array).reset_index(name='event') 

In [321]: r 
Out[321]: 
    m   event 
0 1  [1, 2, 2] 
1 2  [1, 0, 2] 
2 3 [1, 1, 2, 1] 

奖励:

In [322]: r.loc[r.m==1, 'event'] + 1 
Out[322]: 
0 [2, 3, 3] 
Name: event, dtype: object 
+0

即使阵列,完美! – PaulMag

1

你可以

In [1163]: df.groupby('m')['event'].apply(list).reset_index(name='events') 
Out[1163]: 
    m  events 
0 1  [1, 2, 2] 
1 2  [1, 0, 2] 
2 3 [1, 1, 2, 1] 

如果你不想排序m

In [1164]: df.groupby('m', sort=False).event.apply(list).reset_index(name='events') 
Out[1164]: 
    m  events 
0 3 [1, 1, 2, 1] 
1 1  [1, 2, 2] 
2 2  [1, 0, 2] 
+0

只是'申请(列表)'是我当时想念的东西! – PaulMag