【问题标题】:Pandas - slice sections of dataframe into multiple dataframesPandas - 将数据帧的部分切片成多个数据帧
【发布时间】:2018-02-12 03:29:58
【问题描述】:

我有一个包含 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 个单独的数据帧。

我尝试尽我所能进行研究,但找不到可以解决此问题的问题。任何帮助表示赞赏。

谢谢。

【问题讨论】:

  • 当您说“部分”或“部分”时,您指的是一组连续的行,所有这些行都指定了包含标准?是否要保留原始数据框中的索引?
  • 啊。我认为你的意思是分成 consecutive 行满足条件的部分。正确的?这可能很棘手。
  • 您可以先获取所有满足条件的行,然后使用行索引找到您要进行“分节符”的点。除了循环遍历数据框并创建一组索引范围之外,我想不出任何办法。

标签: python pandas dataframe conditional slice


【解决方案1】:

这是另一种方式。

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 做得更好。

【讨论】:

    【解决方案2】:

    你可以试试这个:

    先根据值是大于还是小于1添加0或1的列。

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

    现在按此列分组 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 组

    【讨论】:

      猜你喜欢
      • 2016-12-05
      • 2019-05-31
      • 1970-01-01
      • 2019-07-08
      • 2020-12-18
      • 2018-05-05
      • 1970-01-01
      • 2023-02-05
      • 2019-10-25
      相关资源
      最近更新 更多