Fillna с состоянием назад и вперед в Pandas - PullRequest
1 голос
/ 18 апреля 2020

Я работаю с фреймом данных, в котором есть столбец с несколькими NaN, который я хочу заполнить в соответствии со следующим условием: если при движении назад и вперед до 3 строк есть 2 равных значения, тогда заполните NaN этим значением.

Поскольку это может быть непонятно, приведем несколько примеров ниже:

  col1                    
0 10    
1 10  
2 NaN
3 NaN
4 NaN
5 10
6 5
7 NaN
8 5
9 NaN
10 NaN
11 NaN
12 NaN
  • Значение в строке 2 содержит 10 строк на 1 и 10 строк на 3 идти вперед. -> Заполнить 10
  • Значение в строке 3 имеет 10 на 2 строки назад и 10 на 2 строки вперед. -> Заполните 10
  • Значение в строке 4 имеет 10 на 3 строки назад и 10 на 1 строку вперед. -> Заполните 10
  • Значение в строке 7 имеет строку 5 на 1, идущую назад, и строку 5 на 1, идущую вперед. -> Заполните 5
  • Значение в строке 9 имеет строку 5 на 1, идущую назад, но не 5 в строке 3, идущую вперед. -> Тогда не заполняйте

Тогда результат будет следующим:

  col1                    
0 10    
1 10  
2 10
3 10
4 10
5 10
6 5
7 5
8 5
9 NaN
10 NaN
11 NaN
12 NaN

Есть ли какая-либо функциональность, которую я могу использовать, чтобы придать этой логике c на fillna?

Спасибо !!

1 Ответ

3 голосов
/ 18 апреля 2020

Можно сравнить прямое заполнение и обратное заполнение Series с параметром предела, маску цепи с & для побитового И только для строк с пропущенными значениями и заменить его столбцом прямого заполнения:

m1 = df['col1'].isna()
f = df['col1'].ffill(limit=3)
m2 = f.eq(df['col1'].bfill(limit=3))

df['col2'] = df['col1'].mask(m1 & m2, f)
print (df)
    col1  col2
0   10.0  10.0
1   10.0  10.0
2    NaN  10.0
3    NaN  10.0
4    NaN  10.0
5   10.0  10.0
6    5.0   5.0
7    NaN   5.0
8    5.0   5.0
9    NaN   NaN
10   NaN   NaN
11   NaN   NaN
12   NaN   NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...