Pandas DataFrame 填充某一列的缺失值。

7

我有一个包含以下列的大型数据框:

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在每个Year都有一个age值,例如:

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

我想为每个唯一的ID填充age列中缺失的值,基于它们已有的值。例如,对于上面的ID 280165,我们知道他们在2008年是29岁,鉴于他们在2010年是31岁(2007年28岁、2003年24岁等)。

如何为许多不同的ID每年填写这些缺失的age值?我不确定如何以统一的方式处理整个DataFrame中的数据。在此问题中使用的数据可以在此处找到。


有一个缺失的年份“2009”。就是这样吗? - Henry Yik
是的,2009年不包括在内。我们在这个问题中不考虑它。 - MI MA
2个回答

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)

3

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

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

或者对于具有多个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

2
好的回答 +1,我们可以尝试获取第一个非 NaN 索引而不是 .meanb_idx = df['age'].first_valid_index(); df['age'] = df['Year'] - (df['Year'].ia[b_idx] - df['age'].iat[b_idx]) - Ch3steR
1
你可能需要考虑到有可能存在多个唯一的 ID。 - Ayoub ZAROU
当然,已经添加在上面了。 - Henry Yik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接