2013-07-10 92 views
6

這是我的question的擴展。熊貓數據框分成會話

爲了讓它更簡單讓我們假設我有一個熊貓數據框如下。

df = pd.DataFrame([[1.1, 1.1, 2.5, 2.6, 2.5, 3.4,2.6,2.6,3.4], list('AAABBBBAB'), [1.1, 1.7, 2.5, 2.6, 3.3, 3.8,4.0,4.2,4.3]]).T 
df.columns = ['col1', 'col2','col3'] 

數據框:

col1 col2 col3 
0 1.1 A 1.1 
1 1.1 A 1.7 
2 2.5 A 2.5 
3 2.6 B 2.6 
4 2.5 B 3.3 
5 3.4 B 3.8 
6 2.6 B 4 
7 2.6 A 4.2 
8 3.4 B 4.3 

我想這組基於某些條件。該邏輯基於col1 col2值和col3的累積差異:

  1. 轉到col1並查找其他出現的相同值。
  2. 在我的情況下,col1的第一個值是'1.1',並且它們在row2處的值也是相同的。
  3. 然後檢查col2值,如果它們相似,則獲得col 3的累積差值。
  4. 如果累計差值大於0.5,則將其標記爲新的會話。
  5. 如果COL1值是相同的,但COL2值是不同的,那麼它們標記爲新的會話

預期輸出:

col1 col2 col3 session 
0 1.1 A 1.1 0 
1 1.1 A 1.7 1 
2 2.5 A 2.5 2 
3 2.6 B 2.6 4 
4 2.5 B 3.3 3 
5 3.4 B 3.8 7 
6 2.6 B 4 5 
7 2.6 A 4.2 6 
8 3.4 B 4.3 7 
+0

@unutbu:應該是.. :) –

回答

6

如您鏈接到卓越的答案;)首先創建的會話數:

In [11]: g = df.groupby(['col1', 'col2']) 

In [12]: df['session_number'] = g['col3'].apply(lambda s: (s - s.shift(1) > 0.5).fillna(0).cumsum(skipna=False)) 

那麼我認爲你要set_index這些列的,這可能是足以讓多數用例(儘管它可能是值得做sort):

In [13]: df1 = df.set_index(['col1', 'col2', 'session_number']) 

In [14]: df1 
Out[14]: 
         col3 
col1 col2 session_number 
1.1 A 0    1.1 
      1    1.7 
2.5 A 0    2.5 
2.6 B 0    2.6 
2.5 B 0    3.3 
3.4 B 0    3.8 
2.6 B 1     4 
    A 0    4.2 
3.4 B 0    4.3 

如果你真的想你可以搶出會話號:

In [15]: g1 = df.groupby(['col1', 'col2', 'session_number']) # I think there is a slightly neater way, but I forget.. 

In [16]: df1['session'] = g1.apply(lambda x: 1).cumsum() # could -1 here if it matters 

In [17]: df1 
Out[17]: 
         col3 session 
col1 col2 session_number 
1.1 A 0    1.1  1 
      1    1.7  2 
2.5 A 0    2.5  3 
2.6 B 0    2.6  6 
2.5 B 0    3.3  4 
3.4 B 0    3.8  8 
2.6 B 1     4  7 
    A 0    4.2  5 
3.4 B 0    4.3  8 

如果您希望此列(如你的問題)的reset_index,你可以刪除該會話列:

In [18]: df1.reset_index() 
Out[18]: 
    col1 col2 session_number col3 session 
0 1.1 A    0 1.1  1 
1 1.1 A    1 1.7  2 
2 2.5 A    0 2.5  3 
3 2.6 B    0 2.6  6 
4 2.5 B    0 3.3  4 
5 3.4 B    0 3.8  8 
6 2.6 B    1 4  7 
7 2.6 A    0 4.2  5 
8 3.4 B    0 4.3  8 
+0

再次感謝..超級棒!非常棒!...我沒有文字解釋!:) –