我有这个数据框。我需要将列 rank 中的 NaN 替换为基于多个条件的值。如果 min 列高于 max 列的前 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
答案 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
rolling
和 shift
函数用于检查当前 min
是否大于前三个 max
的 max
。>
ffill
继承了之前的值。