Pandas DataFrame填充列中的缺失值

时间:2020-08-14 12:29:00

标签: python pandas dataframe missing-data

我有一个带有以下各列的大型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    

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

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

我想根据每个唯一age的现有值在ID列中填写缺失值。例如,对于上面的ID 280165,我们知道它们在{{1}中是29,因为它们在2008中是31(2007年为28,而2007年为24 2003等)。

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

2 个答案:

答案 0 :(得分:4)

尝试做:

def get_age(s):
    present = s.age.notna().idxmax()
    diff = s.loc[[present]].eval('age - Year').iat[0]
    s['age'] = diff + s.Year
    return s

df.groupby(['ID']).apply(get_age)

答案 1 :(得分:3)

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

df["age"] =  df["Year"] - (df["Year"]-df["age"]).mean()

或ID大于1的一般解决方案:

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