2017-09-03 160 views
-1

我有一個數據幀的熊貓與3000+行,看起來像這樣:大熊貓 - 數據幀的切片剖面成多個dataframes

t090:   c0S/m:    pr:      timeJ:  potemp090C:   sal00:  depSM:  \ 
407  19.3574  4.16649  1.836  189.617454      19.3571  30.3949   1.824 
408  19.3519  4.47521  1.381  189.617512      19.3517  32.9250   1.372 
409  19.3712  4.44736  0.710  189.617569      19.3711  32.6810   0.705 
410  19.3602  4.26486  0.264  189.617627      19.3602  31.1949   0.262 
411  19.3616  3.55025  0.084  189.617685      19.3616  25.4410   0.083 
412  19.2559  0.13710  0.071  189.617743      19.2559   0.7783   0.071 
413  19.2092  0.03000  0.068  189.617801      19.2092   0.1630   0.068 
414  19.4396  0.00522  0.068  189.617859      19.4396   0.0321   0.068 

我想要做的是:在數據幀的每個部分創建單獨的dataframes列'c0S/m'中的值超過0.1(例如上面示例中的行407-412)。

假設我在我的3000+行數據框中有7個部分,其中第二列中的一系列行超過0.1。我的if/for/while語句將切分這些部分並創建7個獨立的數據框。

我試着研究最好的,但我找不到解決這個問題的問題。任何幫助表示讚賞。

謝謝。

+0

當你說「部分」或「部分」,你指的是一組連續的行,所有這些都有指定的入選標準?你想保留原始數據框中的索引嗎? –

+0

啊。我認爲你的意思是將_consecutive_行滿足條件的部分分開。對?這可能會很棘手。 – Bill

+0

您可以先採取所有滿足條件的行,然後使用行索引查找想要創建「分節」的點。除了循環遍歷數據框和創建一組索引範圍之外,我想不出有什麼辦法。 – Bill

回答

0

這是另一種方式。

sub_set = df[df['c0S/m'] > 0.1] 

last = None 

for i in sub_set.index: 
    if last is None: 
     start = i 
    else: 
     if i - last > 1: 
      print start, last 
      start = i 
    last = i 

我認爲它的工作原理。 (而不是print start, last你可以插入代碼來創建你想要的原始數據幀的片)。

一些巧妙的技巧here做得更好。

0

你可以試試這個:

首先添加的列0或1,根據該值是否大於1或小於更大。

df['splitter'] = np.where(df['c0S/m:'] > 1, 1, 0) 

現在GROUPBY此列diff.cumsum()

df.groupby((df['splitter'].diff(1) != 0).astype('int').cumsum()).apply(lambda x: [x.index.min(),x.index.max()]) 

您獲得所需的指數

splitter 
1 [407, 411] 
2 [412, 414] 
3 [415, 415] 

塊現在你可以使用LOC

df.loc[407:411] 
創建dataframes

注意:我添加了一行來樣DF使用:

df.loc[415] = [19.01, 5.005, 0.09, 189.62, 19.01, 0.026, 0.09] 

才能夠更好的測試,因此其分裂3組