2017-08-03 141 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