2
我有年度数据。这些年份中的每一年都存储在一个单独的数据框中。 某些信息在某些年份缺失,但可能在其他年份可用。如果在失踪的一年之前和之后观察到信息,我只能相信这些信息。 例如: -如果滞后和潜伏期相同,则替换缺失值
Index Identifier Date Owner
1 A 2005 F
2 A 2006 NaN
3 A 2007 F
4 B 2005 G
5 B 2006 NaN
6 B 2007 NaN
7 B 2008 G
8 B 2009 NaN
9 B 2010 F
10 C 2006 H
11 C 2007 NaN
12 C 2008 NaN
这到底应该是这样的:
Index Identifier Date Owner
1 A 2005 F
2 A 2006 F
3 A 2007 F
4 B 2005 G
5 B 2006 G
6 B 2007 G
7 B 2008 G
8 B 2009 NaN
9 B 2010 F
10 C 2006 H
11 C 2007 NaN
12 C 2008 NaN
所以,只有当我观察同一个失踪一年前后应该有一个变化。如果我以后没有观察到任何事情,或者我观察到不同的事情,我不应该改变。实际数据每年约有1000万观测值。所以循环会非常低效。
我目前的解决办法是:
framestot=(df2005, df2006, df2007, df2008, df2009, df2010)
df=pd.concat(framestot, ignore_index=True)
df=df.sort(columns='date', ascending=True, kind='quicksort')
df['lag'] = df.Owner
df['lead'] = df.Owner
df['lag'] = df.groupby(['Identifier'])['lag'].transform(lambda grp: grp.fillna(method='ffill'))
df['lead'] = df.groupby(['Identifier'])['lead'].transform(lambda grp: grp.fillna(method='bfill'))
df.loc[df['Owner'].isnull() & df['lead'] == df['lag'],'Owner'] = df.lag
这似乎是一个非常低效的解决它的方法。有没有办法直接调用这些信息? 如果我没有弄错,这也需要什么是第一个非缺失的滞后和领先。我可以限制吗?例如,如果我只想在最近两年和未来两年更换它们,它们是相同的。如果数据来自两年多前,我保留缺失的值。
有一个'limit' 'fillna'的参数,所以如果你想限制填充方法,你可以通过'limit = 2' – EdChum
谢谢,这绝对解决了第二个问题 – Peter