Условная замена пустых значений в панде
У меня есть датафрейм с малонаселенным столбцом. Большинство значений пустые; единственными другими значениями являются "Купить" и "Продать". Я хотел бы заменить пустые значения на "длинные", если последнее непустое значение было "Купить" или "короткое", если последнее непустое значение было "Продать". Я могу сделать это достаточно легко в цикле, но мне интересно, есть ли нецикличный способ сделать это?
1 ответ
Ты можешь использовать fillna
или же combine_first
для замены None
созданный помощником df
с replace
а также ffill
(fillna
с методом ffill
- прямое наполнение NaN
с и None
s):
np.random.seed(12)
df = pd.DataFrame({'A':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6)),
'B':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6)),
'C':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6))})
print (df)
A B C
0 Buy Sell None
1 None None Buy
2 Sell None Buy
3 None None Buy
4 Buy Buy Sell
5 None None None
6 None None None
7 Buy None None
8 None None Sell
9 Buy Buy None
df = df.fillna(df.replace({'Sell':'short', 'Buy':'long'}).ffill())
#alternative solution
#df = df.combine_first(df.replace({'Sell':'short', 'Buy':'long'}).ffill())
print (df)
A B C
0 Buy Sell None
1 long short Buy
2 Sell short Buy
3 short short Buy
4 Buy Buy Sell
5 long long short
6 long long short
7 Buy long short
8 long long Sell
9 Buy Buy short
Объяснение:
print (df.replace({'Sell':'short', 'Buy':'long'}))
A B C
0 long short None
1 None None long
2 short None long
3 None None long
4 long long short
5 None None None
6 None None None
7 long None None
8 None None short
9 long long None
print (df.replace({'Sell':'short', 'Buy':'long'}).ffill())
A B C
0 long short None
1 long short long
2 short short long
3 short short long
4 long long short
5 long long short
6 long long short
7 long long short
8 long long short
9 long long short