2017-09-03 100 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组