【问题标题】:Changing column based on multiple conditions and previous rows values pandas根据多个条件和前一行值更改列值 pandas
【发布时间】:2021-09-05 12:24:03
【问题描述】:

我有这个数据框。我需要将列 rank 中的 NaN 替换为基于多个条件的值。如果列 min 高于 ma​​x 列的前 3 行,则 rank 等于 min。否则,我需要复制之前的 rank

      max     min    rank
0  128.20  117.87  117.87
1  132.72  122.29  122.29
2  138.07  124.89  124.89
3  137.02  128.46     NaN
4  130.91  129.86     NaN
5  200.15  190.54     NaN
6  199.18  191.79     NaN
7  210.44  201.94     NaN

想要的结果是

      max     min    rank
0  128.20  117.87  117.87
1  132.72  122.29  122.29
2  138.07  124.89  124.89
3  137.02  128.46  124.89
4  130.91  129.86  124.89
5  200.15  190.54  190.54
6  199.18  191.79  190.54
7  210.44  201.94  201.94 

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    IIUC,这是一种方法:

    df['rank'].mask(pd.concat([df['min'].shift(i) for i in range(3)], 1).apply(
        lambda x: x < df['min']).all(1), df['min']).ffill()
    
    输出:
          max     min    rank
    0  128.20  117.87  117.87
    1  132.72  122.29  122.29
    2  138.07  124.89  124.89
    3  137.02  128.46  124.89
    4  130.91  129.86  124.89
    5  200.15  190.54  190.54
    6  199.18  191.79  190.54
    7  210.44  201.94  201.94
    

    【讨论】:

    • 谢谢,简直完美
    【解决方案2】:

    你可以试试:

    df["rank"].update(df[df["min"]>df["max"].rolling(3).max().shift(1)]["min"])
    df["rank"].ffill(inplace=True)
    >>> df
          max     min    rank
    0  128.20  117.87  117.87
    1  132.72  122.29  122.29
    2  138.07  124.89  124.89
    3  137.02  128.46  124.89
    4  130.91  129.86  124.89
    5  200.15  190.54  190.54
    6  199.18  191.79  190.54
    7  210.44  201.94  201.94
    

    rollingshift 函数用于检查当前min 是否大于前三个max 中的max

    ffill 继承前一个值。

    【讨论】:

    • 谢谢,完美运行。我选择了另一个答案是正确的,因为它只是一行代码,但你的也没有任何问题
    猜你喜欢
    • 2022-01-25
    • 2021-03-02
    • 1970-01-01
    • 2020-08-20
    • 2012-10-15
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多