我目前的问题如下所示。考虑 Dataframe :
name score date
0 Alice 22.0 2020-12-31
15 Alice 4.0 2005-12-31
5 Alice 1.0 2003-12-31
10 Alice NaN 2000-12-31
6 Bob 8.0 2001-11-02
16 Bob 1.0 2004-11-02
11 Bob 5.0 2003-11-02
1 Bob 45.0 1980-11-02
12 Chuck 9.0 2003-12-03
2 Chuck 4.0 2015-12-03
7 Chuck 9.0 2001-12-03
17 Chuck 2.0 2004-12-03
18 Daren 3.0 2004-03-13
21 Daren 89.0 2015-08-13
3 Daren NaN 2015-03-13
20 Daren 12.0 2015-05-13
8 Daren 5.0 2015-03-17
13 Daren 93.0 2003-03-13
14 Elisa 11.0 2003-01-24
9 Elisa 19.0 2001-01-24
19 Elisa 23.0 2004-01-24
4 Elisa 16.0 2010-01-24
一些score
值是nan
。我想用这个人的最接近的分数(w.r.t. time
)来替换这些值,假设时间差在1年内,即365天。如果没有这样的时间,则保留值为nan
。
在上面的 Dataframe 中,Daren的nan
分数值将被替换为5,因为存在在nan
日期的一年内记录的分数,并且该分数是与其他可能分数的最小时间差。然而,对于Alice,不存在在nan
分数的一年内记录的这样的分数。因此她的nan
分数将被保持为nan
。
要重新生成 Dataframe ,请使用以下代码:
import numpy as np
import pandas as pd
import datetime
data = {"name": ['Alice', 'Bob', 'Chuck', 'Daren', 'Elisa', 'Alice', 'Bob', 'Chuck', 'Daren', 'Elisa','Alice', 'Bob', 'Chuck', 'Daren', 'Elisa','Alice', 'Bob', 'Chuck', 'Daren', 'Elisa','Daren','Daren'],
"score": [22,45,4,np.nan,16,1,8,9,5,19,np.nan,5,9,93,11,4,1,2,3,23,12,89],
"date": ['31/12/2020','11/02/1980','12/03/2015','13/03/2015','24/01/2010','31/12/2003','11/02/2001','12/03/2001','17/03/2015','24/01/2001','31/12/2000','11/02/2003','12/03/2003','13/03/2003','24/01/2003','31/12/2005','11/02/2004','12/03/2004','13/03/2004','24/01/2004','13/05/2015','13/08/2015']}
df = pd.DataFrame(data = data)
df['date'] = pd.to_datetime(df['date'])
df.sort_values(by='name')
3条答案
按热度按时间axzmvihb1#
假设df与上述问题中给出的 Dataframe 相同:
3phpmpom2#
首先基于
names
对值进行排序,并从日期列中提取年份。然后按year
分组给出编号
iyfamqjs3#