Конкретное значение обратной засыпки панд - PullRequest
0 голосов
/ 07 июня 2018

У меня есть датафрейм как таковой:

df = pd.DataFrame({'val': [np.nan,np.nan,np.nan,np.nan, 15, 1, 5, 2,np.nan, np.nan, np.nan, np.nan,np.nan,np.nan,2,23,5,12, np.nan np.nan, 3,4,5]})
df['name'] = ['a']*8 + ['b']*15

df

>>> 
    val name
0   NaN    a
1   NaN    a
2   NaN    a
3   NaN    a
4   15.0   a
5   1.0    a
6   5.0    a
7   2.0    a
8   NaN    b
9   NaN    b
10  NaN    b
11  NaN    b
12  NaN    b
13  NaN    b
14  2.0    b
15  23.0   b
16  5.0    b
17  12.0   b
18  NaN    b
19  NaN    b
20  3.0    b
21  4.0    b
22  5.0    b

Для каждого name я хочу заполнить предыдущие 3 пэ-позиции с -1, чтобы я в итоге получил

>>>
    val name
0   NaN     a
1   -1.0    a
2   -1.0    a
3   -1.0    a
4   15.0    a
5   1.0     a
6   5.0     a
7   2.0     a
8   NaN     b
9   NaN     b
10  NaN     b
11  -1.0    b
12  -1.0    b
13  -1.0    b
14  2.0     b
15  23.0    b
16  5.0     b
17  12.0    b
18  -1      b
19  -1      b
20  3.0     b
21  4.0     b
22  5.0     b

Обратите внимание, что может быть несколько разделов с NaN.Если раздел содержит менее 3-х nans, он заполнит их все (он заполняет все до 3-х).

1 Ответ

0 голосов
/ 08 июня 2018

Вы можете использовать first_valid_index, вернуть первое ненулевое значение каждой группы, а затем присвоить -1, используя loc

idx=df.groupby('name').val.apply(lambda x : x.first_valid_index())
for x in idx:
    df.loc[x - 3:x - 1, 'val'] = -1

df
Out[51]: 
     val name
0    NaN    a
1   -1.0    a
2   -1.0    a
3   -1.0    a
4   15.0    a
5    1.0    a
6    5.0    a
7    2.0    a
8    NaN    b
9    NaN    b
10   NaN    b
11  -1.0    b
12  -1.0    b
13  -1.0    b
14   2.0    b
15  23.0    b
16   5.0    b
17  12.0    b

Обновление

s=df.groupby('name').val.bfill(limit=3)
s.loc[s.notnull()&df.val.isnull()]=-1
s
Out[59]: 
0      NaN
1     -1.0
2     -1.0
3     -1.0
4     15.0
5      1.0
6      5.0
7      2.0
8      NaN
9      NaN
10     NaN
11    -1.0
12    -1.0
13    -1.0
14     2.0
15    23.0
16     5.0
17    12.0
18     NaN
19    -1.0
20    -1.0
21    -1.0
22     3.0
23     4.0
24     5.0
Name: val, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...