我有一个看起来像这样的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
,但常规列表也可以。
答案 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]