Заполнение пропущенных значений возрастающими значениями в pandas

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть фрейм данных, который содержит идентификатор инструмента и время.

Для последней даты у меня есть значения счетчика инструментов, и мне нужно заполнить недостающие значения счетчика в dataframe путем вычитания 1 из счетчика за каждый раз, когда идентификатор использовался на определенную дату.

 data = {"id":["01","02","03","04","05",
          "02","02","03","05","04",
          "03","05","01","05","04",], 
    "counter": [100,200,300,400,500,
                np.nan,np.nan,np.nan,np.nan,np.nan,
                np.nan,np.nan,np.nan,np.nan,np.nan],
   "date": ["2020-02-04","2020-02-04","2020-02-04","2020-02-04","2020-02-04",
            "2020-02-02","2020-02-02","2020-02-02","2020-02-02","2020-02-02",
           "2020-02-03","2020-02-03","2020-02-03","2020-02-03","2020-02-03"]}

df = pd.DataFrame(data)

df_sort = df.sort_values(by=["id","date"], ascending = False)
 

Фрейм данных выглядит следующим образом:

     id  counter date
4   05  500.0   2020-02-04
11  05  NaN     2020-02-03
13  05  NaN     2020-02-03
8   05  NaN     2020-02-02
3   04  400.0   2020-02-04
14  04  NaN     2020-02-03
9   04  NaN     2020-02-02
2   03  300.0   2020-02-04
10  03  NaN     2020-02-03
7   03  NaN     2020-02-02
1   02  200.0   2020-02-04
5   02  NaN     2020-02-02
6   02  NaN     2020-02-02
0   01  100.0   2020-02-04
12  01  NaN     2020-02-03
 

Желаемый результат был бы таким:

     id  counter date
4   05  500.0   2020-02-04
11  05  501     2020-02-03
13  05  502     2020-02-03
8   05  503     2020-02-02
3   04  400.0   2020-02-04
14  04  401     2020-02-03
9   04  402     2020-02-02
2   03  300.0   2020-02-04
10  03  301     2020-02-03
7   03  302     2020-02-02
1   02  200.0   2020-02-04
5   02  201     2020-02-02
6   02  202     2020-02-02
0   01  100.0   2020-02-04
12  01  101     2020-02-03
 

Пожалуйста, помогите мне, как я могу это сделать.
Спасибо!

Ответ №1:

Вы можете groupby включить df_sort id фрейм данных, затем перенаправить counter значения для каждой группы, используя ffill и добавляя их с помощью последовательного счетчика, созданного с помощью groupby.cumcount :

 g = df_sort.groupby('id')
df_sort['counter'] = g['counter'].ffill()   g.cumcount()
 

 print(df_sort)

    id  counter        date
4   05    500.0  2020-02-04
11  05    501.0  2020-02-03
13  05    502.0  2020-02-03
8   05    503.0  2020-02-02
3   04    400.0  2020-02-04
14  04    401.0  2020-02-03
9   04    402.0  2020-02-02
2   03    300.0  2020-02-04
10  03    301.0  2020-02-03
7   03    302.0  2020-02-02
1   02    200.0  2020-02-04
5   02    201.0  2020-02-02
6   02    202.0  2020-02-02
0   01    100.0  2020-02-04
12  01    101.0  2020-02-03