#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