代码之家  ›  专栏  ›  技术社区  ›  July

如何获得两个条件之间的最小值

  •  0
  • July  · 技术社区  · 2 年前

    start 列为 True 并在 end 列为 真的

    获得的结果分配给 result

    输入:

    import pandas as pd
    import numpy as np
    A = [6, 12, 21, 15, 18, 19, 13, 9, 10, 50]
    cond1 = [False, True, False, False, False, False, True, False, False, False]
    cond2 = [False, False, False, True, False, False, False, False, True, False]
    df = pd.DataFrame({'A' : A, 'start' : cond1, 'end' : cond2})
    

    预期输出

        A   start   end    result
    0   6   FALSE   FALSE   
    1   12  TRUE    FALSE   
    2   21  FALSE   FALSE   
    3   15  FALSE   TRUE    12
    4   18  FALSE   FALSE   12
    5   19  FALSE   FALSE   12
    6   13  TRUE    FALSE   12
    7   9   FALSE   FALSE   12
    8   10  FALSE   TRUE    9
    9   50  FALSE   FALSE   9
    

    索引3计算从索引1到索引3的最小值

    索引8计算从索引6到索引8的最小值

    2 回复  |  直到 2 年前
        1
  •  0
  •   BENY    2 年前

    我们可能需要创建 groupby 键带有 cumsum 然后 transform 这个 min 每组的,以及 shift

    df.loc[df.end,'new'] = (df.groupby([df['start'].cumsum(),df['end'].cumsum()]).
                            A.transform('min').shift())
    df['new'] = df['new'].ffill()
    df
    Out[333]: 
        A  start    end   new
    0   6  False  False   NaN
    1  12   True  False   NaN
    2  21  False  False   NaN
    3  15  False   True  12.0
    4  18  False  False  12.0
    5  19  False  False  12.0
    6  13   True  False  12.0
    7   9  False  False  12.0
    8  10  False   True   9.0
    9  50  False  False   9.0
    
        2
  •  0
  •   Gimhan Ranasinghe    2 年前

    这里有一个简单的算法来解决你的问题

    import pandas as pd
    
    A=[6,12,21,15,18,19,13,9,10,50]
    cond1=[False,True,False,False,False,False,True,False,False,False]
    cond2=[False,False,False,True,False,False,False,False,True,False]
    result=[]
    numbers =[]
    index=0
    
    for i in A:
        result.append("")
    
    minimum=None;
    while index<len(A):
        if (cond1[index]):
            while(not(cond2[index])):
                numbers.append(A[index])
                if (minimum != None):
                    result[index]=minimum
                index += 1
            minimum = min(numbers)
            result[index]=minimum
            numbers=[]
            if(i==index):
                index+=1
        else:
    
            if (minimum != None):
                result[index]=minimum
            index+=1
    
    df=pd.DataFrame({'A':A,'start':cond1,'end':cond2,'result':result})
    print(df)
    

    输出

        A  start    end result
    0   6  False  False       
    1  12   True  False       
    2  21  False  False       
    3  15  False   True     12
    4  18  False  False     12
    5  19  False  False     12
    6  13   True  False     12
    7   9  False  False     12
    8  10  False   True      9
    9  50  False  False      9
    

    希望这能帮助你达到预期的效果。