我有一个带有以下各列的大型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
列的值范围从1991
到2017
。大多数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中找到在本问题中用作示例的数据。
答案 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