2015-11-28 231 views
1

我有一個像這樣的分割基於列數據幀值

EndDate 
2007-10-31    0 
2007-11-30 -0.03384464 
2007-12-31  -0.0336299 
2008-01-31 -0.009448923 
2008-02-29    0 
2008-03-31 -0.05744962 
2008-04-30  -0.0386942 
2008-05-31    0 
2008-06-30 -0.03624518 
2008-07-31 -0.005286455 
2008-08-31    0 
2008-09-30  -0.1619864 
2008-10-31  -0.2862122 
2008-11-30  -0.2942793 
2008-12-31  -0.2913253 

一個數據幀現在我想的0 因此新dataframes每一次出現後的數據幀拆分應該是這樣的:

Dataframe 1: 
    2007-11-30 -0.03384464 
    2007-12-31  -0.0336299 
    2008-01-31 -0.009448923 
    2008-02-29    0 

Dataframe 2: 
    2008-03-31 -0.05744962 
    2008-04-30  -0.0386942 
    2008-05-31    0 

Dataframe 3: 
    2008-06-30 -0.03624518 
    2008-07-31 -0.005286455 
    2008-08-31    0 

Dataframe 4: 
    2008-09-30  -0.1619864 
    2008-10-31  -0.2862122 
    2008-11-30  -0.2942793 
    2008-12-31  -0.2913253 

我不知道如何做到這一點。 我可以遍歷每一行尋找0,但我認爲應該有更好的方法。

回答

2

首先,您可以通過將值列與零進行比較並獲取這些布爾值的累積和來創建組編號。

df['group_no'] = (df.val == 0).cumsum() 
>>> df.head(6) 
     EndDate  val group_no 
0 2007-10-31 0.000000   1 
1 2007-11-30 -0.033845   1 
2 2007-12-31 -0.033630   1 
3 2008-01-31 -0.009449   1 
4 2008-02-29 0.000000   2 
5 2008-03-31 -0.057450   2 

接下來,你可以一起使用字典理解與loc選擇相關group_no數據幀。要獲得最後一個組號碼,我使用iat獲取最後一個值,以便進行基於位置的索引。

d = {i: df.loc[df.group_no == i, ['EndDate', 'val']] 
    for i in range(1, df.group_no.iat[-1])} 

>>> d 
{1:  EndDate  val 
0 2007-10-31 0.000000 
1 2007-11-30 -0.033845 
2 2007-12-31 -0.033630 
3 2008-01-31 -0.009449, 
2:  EndDate  val 
4 2008-02-29 0.000000 
5 2008-03-31 -0.057450 
6 2008-04-30 -0.038694, 
3:  EndDate  val 
7 2008-05-31 0.000000 
8 2008-06-30 -0.036245 
9 2008-07-31 -0.005286} 

EDIT 如所建議的通過@DSM,使用GROUPBY似乎是大約6×更快基於樣本數據幀與15K行。

d = {n: df2.ix[rows] 
    for n, rows in enumerate(df2.groupby('group_no').groups)} 
+0

我認爲,使用'groupby''group_no'既清潔又快捷。 – DSM

0

亞歷山大的解決方案沒有工作。有一個小錯誤。代碼應該是:

d = {n: df2.iloc[rows] 
for n, rows in df2.groupby('group_no').groups.items()}