Условная замена пустых значений в панде

У меня есть датафрейм с малонаселенным столбцом. Большинство значений пустые; единственными другими значениями являются "Купить" и "Продать". Я хотел бы заменить пустые значения на "длинные", если последнее непустое значение было "Купить" или "короткое", если последнее непустое значение было "Продать". Я могу сделать это достаточно легко в цикле, но мне интересно, есть ли нецикличный способ сделать это?

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
Другие вопросы по тегам