根据多个条件和以前的行值更改列熊猫

时间:2021-06-21 20:50:25

标签: python pandas dataframe

我有这个数据框。我需要将列 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 

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你可以试试:

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 是否大于前三个 maxmax

ffill 继承了之前的值。