2017-11-18 93 views
1

我为工作日以下数据框传播值大熊猫失踪日期

In [23]: d = pd.DataFrame({'date' : ['20070105', '20070105', '20070106', '20070106', '20070106', '20070109'], 's' : [1, 2, 1,2,3,1], 'i': ['a', 'b', 'a', 'b', 'c', 'a']}) 
In [26]: d['date'] = pd.to_datetime(d['date'], format='%Y%m%d') 
In [27]: d 
Out[27]: 
     date i s 
0 2007-01-05 a 1 
1 2007-01-05 b 2 
2 2007-01-06 a 1 
3 2007-01-06 b 2 
4 2007-01-06 c 3 
5 2007-01-09 a 1 

我想在数据填写(根据“奥尔代斯”日历)失踪日期和输出应该是如下。基本上20070107和20070108失踪,其数据来自20070106.

Out[31]: 
     date i s 
0 2007-01-05 a 1 
1 2007-01-05 b 2 
2 2007-01-06 a 1 
3 2007-01-06 b 2 
4 2007-01-06 c 3 
5 2007-01-07 a 1 
6 2007-01-07 b 2 
7 2007-01-07 c 3 
8 2007-01-08 a 1 
9 2007-01-08 b 2 
10 2007-01-08 c 3 
11 2007-01-09 a 1 

什么是大熊猫做到这一点的最佳方式复制?

+0

请参阅[如何使重复性好大熊猫的例子(http://stackoverflow.com/questions/20109391/how-to- make-good-reproducible-pandas-examples)并相应地编辑你的文章。在输入和输出数据集中使用日期而不是字符串 – MaxU

+0

谢谢。增加了可重复的代码。 – Man

回答

2

用途:

  • set_index通过cumcount独特MultiIndex
  • 重塑通过unstack独特DatetimeIndex
  • reindex在指数最小值和最大值,加上由method='ffill'
  • 遗漏值的重塑回stack
  • l AST去除MultiIndex秒水平和转换Datetimeindex

df = (
     d.set_index(['date', d.groupby('date').cumcount()]) 
     .unstack() 
     .reindex(pd.date_range(d['date'].min(), d['date'].max()), method='ffill') 
     .stack() 
     .reset_index(level=1, drop=True) 
     .rename_axis('date') 
     .reset_index() 
     ) 
print (df) 

     date i s 
0 2007-01-05 a 1.0 
1 2007-01-05 b 2.0 
2 2007-01-06 a 1.0 
3 2007-01-06 b 2.0 
4 2007-01-06 c 3.0 
5 2007-01-07 a 1.0 
6 2007-01-07 b 2.0 
7 2007-01-07 c 3.0 
8 2007-01-08 a 1.0 
9 2007-01-08 b 2.0 
10 2007-01-08 c 3.0 
11 2007-01-09 a 1.0 
+0

这不适合我。我现在用适当的示例代码更新了我的示例,以便问题清楚。 – Man

+0

检查编辑的答案,只需要将'date'添加到'set_index'函数。 – jezrael

+0

@非常好的和通用的解决方案! +1 – MaxU