代码之家  ›  专栏  ›  技术社区  ›  Vishnudev Krishnadas

熊猫:在另一列的标志之间标记值

  •  1
  • Vishnudev Krishnadas  · 技术社区  · 6 年前

    1. Groupby LineNum然后
    2. 将LWS列中大于50的值标记为“开始”
    3. 将包含“:”(冒号)的文本列中的值标记为“结束”
    4. 在“ExpectedFlag”中将开始和结束之间的值标记为1

    我已经完成了步骤3,也就是到了名为“end”的列

    我不知道如何将start和end之间的值标记为ExpectedFlag。有没有办法用熊猫操作来标记这个?

            text  LWS LineNum   start   end     ExpectedFlag
    0   somethin    3       2       0     0                0
    1   somethin    3       2       0     0                0
    2   somethin    2       2       0     0                0
    3   value      70       2       1     0                1
    4   value       3       2       0     0                1
    5   value:      3       2       0     1                1
    6   val1      200       3       1     0                1
    7   val1:       3       3       0     1                1
    8   val2        3       3       0     0                0
    9   val2      100       3       1     0                1
    10  val2:       3       3       0     1                1
    11  djsal       3       3       0     0                0
    12  jdsal       3       3       0     0                0
    13  ajsd        3       3       0     0                0
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   hellpanderr pweitzman    6 年前

    关于填充值介于 start end ,这可以按以下方式进行,基于 this answer :

    数据:

    df = pd.DataFrame([[0,0],[0,0],[0,0],[1,0],[0,0],[0,1],[0,0],[0,0],[1,0],[0,1],[0,0],[0,0],[0,0],[0,0],[1,0],[0,0],[0,0],[0,1],[0,0],[0,0],[0,0],],columns=['start','end'])

       start end
    0   0   0
    1   0   0
    2   0   0
    3   1   0
    4   0   0
    5   0   1
    6   0   0
    7   0   0
    8   1   0
    9   0   1
    10  0   0
    

    开始 结束 :

    s = df.start.nonzero()[0]
    e = df.end.nonzero()[0]
    >>> s, e
    (array([3, 8], dtype=int64), array([5, 9], dtype=int64))
    

    >>> index = df.index.values.reshape(-1,1)
    
    array([[ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5],
       [ 6],
       [ 7],
       [ 8],
       [ 9],
       [10]], dtype=int64)
    

    broadcasting

    >>> index < [1]       >>> index < [1,2,3,4,5]
    array([[ True],       array([[ True,  True,  True,  True,  True],
           [False],             [False,  True,  True,  True,  True],
           [False],             [False, False,  True,  True,  True],
           [False],             [False, False, False,  True,  True],
           [False],             [False, False, False, False,  True],
           [False],             [False, False, False, False, False],
           [False],             [False, False, False, False, False],
           [False],             [False, False, False, False, False],
           [False],             [False, False, False, False, False],
           [False],             [False, False, False, False, False],
           [False]])            [False, False, False, False, False]])
    

    对于每个 - 成对生成条件:

    >>> ((s <= index) & (index <= e))
    
    array([[False, False],
           [False, False],
           [False, False],
           [ True, False],
           [ True, False],
           [ True, False],
           [False, False],
           [False, False],
           [False,  True],
           [False,  True],
           [False, False]])
    

    sum :

     df['Expected Flag'] = ((s <= index) & (index <= e)).sum(axis=1)
    
        start  end  Expected Flag
    0       0    0              0
    1       0    0              0
    2       0    0              0
    3       1    0              1
    4       0    0              1
    5       0    1              1
    6       0    0              0
    7       0    0              0
    8       1    0              1
    9       0    1              1
    10      0    0              0
    

    一行: ((df.start.nonzero()[0] <= df.index.values.reshape(-1,1)) & (df.index.values.reshape(-1,1) <= df.end.nonzero()[0])).sum(axis=1)

        2
  •  1
  •   Alex    6 年前

    您可以编写并应用函数来执行此操作:

    def proc():
        started = False
        def inner(b):
            nonlocal started
            if started:
                if b == 1:
                    started = False
                return 1
            else:
                if b == 1:
                    started = True
                    return 1
                return 0
        return inner
    
    df['ExpectedFlag'] = (df['start'] + df['end']).apply(proc())
    df
    

    退货

            text  LWS  LineNum  start  end  ExpectedFlag
    0   somethin    3        2      0    0             0
    1   somethin    3        2      0    0             0
    2   somethin    2        2      0    0             0
    3      value   70        2      1    0             1
    4      value    3        2      0    0             1
    5     value:    3        2      0    1             1
    6       val1  200        3      1    0             1
    7      val1:    3        3      0    1             1
    8       val2    3        3      0    0             0
    9       val2  100        3      1    0             1
    10     val2:    3        3      0    1             1
    11     djsal    3        3      0    0             0
    12     jdsal    3        3      0    0             0
    13      ajsd    3        3      0    0             0