[英]How to populate rows of pandas dataframe column based with previous row based on a multiple conditions?
[英]Changing column based on multiple conditions and previous rows values pandas
我有這個數據框。 我需要將列排名中的 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
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
你可以試試:
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
繼承了先前的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.