Pandas:将重复行的列分组到列表列中

时间:2017-08-03 16:14:03

标签: python pandas dataframe

我有一个看起来像这样的Pandas数据框:

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

我想根据m列将事件列的值分组到列表中,以便我得到这个:

>>> 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方法以优雅的方式执行我想要的转换吗?

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]