Pandas - 将数据帧的各个部分切分为多个数据帧

时间:2017-09-03 21:01:38

标签: python pandas dataframe conditional slice

我有一个包含3000多行的Pandas数据框,如下所示:

    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

我想要做的是:从数据框的每个部分创建单独的数据帧,其中'c0S / m'列中的值超过0.1(例如上例中的行407-412)。

因此,假设我的3000多行数据帧中有7个部分,其中第二列中的一系列行超过0.1。我的if / for / while语句将对这些部分进行切片并创建7个独立的数据帧。

我尝试了尽可能最好的研究,但找不到可以解决这个问题的问题。任何帮助表示赞赏。

谢谢。

2 个答案:

答案 0 :(得分: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可以做得更好。

答案 1 :(得分:0)

你可以试试这个:

首先根据值是否大于1来添加0或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]

注意:我使用以下方法为您的样本df添加了一行:

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

能够更好地测试,因此能够在3组中进行分裂