代码之家  ›  专栏  ›  技术社区  ›  Inder Manali

使用列表列表作为掩码将数据帧拆分为多个数据帧

  •  1
  • Inder Manali  · 技术社区  · 4 年前

    我有一个熊猫数据框,看起来像这样

    A BB
    1 foo.bar
    2 foo.bar
    3 foo.foo
    4 foo.bar
    5 foo.bar
    6 foo.foo
    

    我基本上希望根据以下列表从中获得两个数据帧:

    [[False, False, True], [False, False, True]]
    

    输出应为:

    df1:

    A BB
    1 foo.bar
    2 foo.bar
    3 foo.foo
    

    df2

    A BB
    4 foo.bar
    5 foo.bar
    6 foo.foo
    
    2 回复  |  直到 4 年前
        1
  •  2
  •   piRSquared    4 年前

    努比:

    • flatnonzero 找到 'foo.foo' 排成一排
    • split 相应地划分数据帧

    import numpy as np
    
    np.split(df, np.flatnonzero(df.BB.eq('foo.foo'))[:-1] + 1)
    
    [   A       BB
     0  1  foo.bar
     1  2  foo.bar
     2  3  foo.foo,
        A       BB
     3  4  foo.bar
     4  5  foo.bar
     5  6  foo.foo]
    

    寻址 @mozway's 议论

    list(filter(
        lambda d: not d.empty,
        np.split(df, np.flatnonzero(df.BB.eq('foo.foo')) + 1)
    ))
    
    [   A       BB
     0  1  foo.bar
     1  2  foo.bar
     2  3  foo.foo,
        A       BB
     3  4  foo.bar
     4  5  foo.bar
     5  6  foo.foo]
    
        2
  •  2
  •   fsimonjetz    4 年前

    你可以

    • 去哪排 df.BB 等于 'foo.foo'
    • 把它移一排
    • 将累计金额应用于该项目,然后
    • 根据结果指数进行分组。

    你最终会得到一个 groupby 对象,可以将其转换为子dfs列表。

    >>> groups = df.groupby(df.BB.eq('foo.foo').shift(fill_value=0).cumsum())
    >>> frames = [frame for _, frame in groups]
    >>> frames # list of sub-dfs
    [   A       BB
     0  1  foo.bar
     1  2  foo.bar
     2  3  foo.foo,
        A       BB
     3  4  foo.bar
     4  5  foo.bar
     5  6  foo.foo]
    
        3
  •  0
  •   Corralien    4 年前

    这是你所期待的吗:

    m = len(df) // 2
    df1, df2 = df.iloc[:m], df.iloc[m:]
    

    输出:

    >>> df1
       A       BB
    0  1  foo.bar
    1  2  foo.bar
    2  3  foo.foo
    
    >>> df2
       A       BB
    3  4  foo.bar
    4  5  foo.bar
    5  6  foo.foo
    

    或使用 np.split

    df1, df2 = np.split(df, 2)