2013-09-05 194 views
1

所以我有以下的數據幀DF:熊貓截斷數據幀

enter image description here

的幀包含數據的兩個組被該組中的排序。

組1是從索引359至365包容

組2是從索引366至371包容

我想將它們分成兩組。可能有兩個以上的小組。我正在應用的邏輯是每當下一個STEPS_ID小於當前的STEPS_ID時,這標誌着組的結束。

我很容易能夠通過df.STEPS_ID <得到這個指針= df.STEPS_ID.shift(-1)

有一種優雅的方式熊貓可以輕鬆地實現這一目標可能使用矢量操作,而不是循環?

這似乎是一個常見的問題,我相信必須有一個明確的算法來解決這類問題。我也希望你們能指導我閱讀這些算法的理論基礎。

+2

對於將來的問題,它會使* far *回答更容易,如果您粘貼Dat aFrame作爲文本(使用Ctrl-K縮進4個空格),而不是圖像(無法複製和粘貼)。 –

回答

4

有多種方法可以「將事物分組」。一種方法是製作一個組列表。但是,這不是處理熊貓DataFrame的理想方式。一旦你有了一個列表,你就不得不在Python循環中遍歷列表。與本地熊貓業務相比,這些速度相對較慢。

假設你有足夠的內存,更好的辦法是一個列或索引添加到數據幀:

import pandas as pd 
df = pd.DataFrame({'STEPS_ID':range(1107,1113)*2}) 
df['GROUP'] = (df['STEPS_ID'] < df['STEPS_ID'].shift(1)).astype('int').cumsum() 
# df.set_index('GROUP', inplace=True, append=True) 
print(df) 

產量

STEPS_ID GROUP 
0  1107  0 
1  1108  0 
2  1109  0 
3  1110  0 
4  1111  0 
5  1112  0 
6  1107  1 
7  1108  1 
8  1109  1 
9  1110  1 
10  1111  1 
11  1112  1 

現在你可以在每做匯聚/轉換操作通過呼叫

df.groupby('GROUP').... 
+3

dang,打我吧。另外,這個黑客攻擊在master中是固定的(所以你不必再在0.13中做) –