2015-11-06 65 views
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 

这似乎是一个非常低效的解决它的方法。有没有办法直接调用这些信息? 如果我没有弄错,这也需要什么是第一个非缺失的滞后和领先。我可以限制吗?例如,如果我只想在最近两年和未来两年更换它们,它们是相同的。如果数据来自两年多前,我保留缺失的值。

+0

有一个'limit' 'fillna'的参数,所以如果你想限制填充方法,你可以通过'limit = 2' – EdChum

+0

谢谢,这绝对解决了第二个问题 – Peter

回答

0

一个简单的解决方案,但不是特别有效是比较向前填充和向后填充:

In [11]: df['Owner'].ffill() 
Out[11]: 
0  F 
1  F 
2  F 
3  G 
4  G 
5  G 
6  G 
7  G 
8  F 
9  H 
10 H 
11 H 
Name: Owner, dtype: object 

In [12]: ff = df['Owner'].ffill() 

In [13]: ff[ff == df['Owner'].bfill()] 
Out[13]: 
0 F 
1 F 
2 F 
3 G 
4 G 
5 G 
6 G 
8 F 
9 H 
Name: Owner, dtype: object 

和剪接回这些原来的柱:

In [14]: df['Owner'] = ff[ff == df['Owner'].bfill()] 

In [15]: df 
Out[15]: 
    Index Identifier Date Owner 
0  1   A 2005  F 
1  2   A 2006  F 
2  3   A 2007  F 
3  4   B 2005  G 
4  5   B 2006  G 
5  6   B 2007  G 
6  7   B 2008  G 
7  8   B 2009 NaN 
8  9   B 2010  F 
9  10   C 2006  H 
10  11   C 2007 NaN 
11  12   C 2008 NaN