Pandas DataFrame 填充列中的缺失值

MI *_* MA 6 python missing-data dataframe pandas

我有一个包含以下列的大型 DataFrame:

import pandas as pd 

x = pd.read_csv('age_year.csv')
x.head()

ID  Year    age
22445   1991    
29925   1991    
76165   1991    
223725  1991    16.0
280165  1991    

Run Code Online (Sandbox Code Playgroud)

Year列的值范围从19912017。大多数在 each 中ID都有一个ageYear,例如:

x.loc[x['ID'] == 280165].to_clipboard(index = False)

ID  Year    age
280165  1991    
280165  1992    
280165  1993    
280165  1994    
280165  1995    16.0
280165  1996    17.0
280165  1997    18.0
280165  1998    19.0
280165  1999    20.0
280165  2000    21.0
280165  2001    
280165  2002    
280165  2003    
280165  2004    25.0
280165  2005    26.0
280165  2006    27.0
280165  2007    
280165  2008    
280165  2010    31.0
280165  2011    32.0
280165  2012    33.0
280165  2013    34.0
280165  2014    35.0
280165  2015    36.0
280165  2016    37.0
280165  2017    38.0
Run Code Online (Sandbox Code Playgroud)

我想根据现有值为age每个唯一值填充列中的缺失ID值。例如,对于ID上面的280165,我们知道它们在292008,因为它们在312010(2007 年为28,2003年为 24,依此类推)。

应该如何为每年的age许多唯一值填充这些缺失值ID?我不确定如何在整个 DataFrame 中以统一的方式执行此操作。在此问题中用作示例的数据可以在此处找到。

Hen*_*Yik 3

我认为与其尝试填充值,不如查找出生年份。

df["age"] =  df["Year"] - (df["Year"]-df["age"]).mean()
Run Code Online (Sandbox Code Playgroud)

或者具有超过 1 个 id 的通用解决方案:

s = df.loc[df["age"].notnull()].groupby("ID").first()

df["age"] = df["Year"]-df["ID"].map(s["Year"]-s["age"])

print (df)

        ID  Year   age
0   280165  1991  12.0
1   280165  1992  13.0
2   280165  1993  14.0
3   280165  1994  15.0
4   280165  1995  16.0
5   280165  1996  17.0
6   280165  1997  18.0
7   280165  1998  19.0
8   280165  1999  20.0
9   280165  2000  21.0
10  280165  2001  22.0
11  280165  2002  23.0
12  280165  2003  24.0
13  280165  2004  25.0
14  280165  2005  26.0
15  280165  2006  27.0
16  280165  2007  28.0
17  280165  2008  29.0
18  280165  2010  31.0
19  280165  2011  32.0
20  280165  2012  33.0
21  280165  2013  34.0
22  280165  2014  35.0
23  280165  2015  36.0
24  280165  2016  37.0
25  280165  2017  38.0
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案+1,我们可以尝试获取第一个非 NaN 索引,而不是 `.mean`,`b_idx = df['age'].first_valid_index(); df['年龄'] = df['年份'] - (df['年份'].ia[b_idx] - df['年龄'].iat[b_idx])` (2认同)