如何逐项重新采样熊猫的日期?

时间:2016-06-19 16:16:04

标签: python-2.7 pandas resampling

我的目标是在pandas中添加行,以便用以前的数据替换丢失的数据,同时重新采样日期。示例: 这就是我所拥有的:

date        wins    losses
2015-12-19  11         5
2015-12-20  17         8
2015-12-20  10         6
2015-12-21  15         1
2015-12-25  11         5
2015-12-26  6         10
2015-12-27  10         6
2015-12-28  4         12
2015-12-29  8         11

这就是我想要的:

            wins    losses
date        
2015-12-19  11.0    5.0
2015-12-20  10.0    6.0
2015-12-21  15.0    1.0
2015-12-22  15.0    1.0
2015-12-23  15.0    1.0
2015-12-24  15.0    1.0
2015-12-25  11.0    5.0
2015-12-26  6.0     10.0
2015-12-27  10.0    6.0
2015-12-28  4.0     12.0
2015-12-29  8.0     11.0

这是我的代码:

resamp = df.set_index('date').resample('D', how='last', fill_method='ffill')

有效! 但我想用2200万行(熊猫),不同的日期和不同的ID来做同样的事情。

此数据框包含两个productID(1和2)。我想做同样的先前练习并保留每个productID的时间系列数据。

createdAt   productId   popularity
2015-12-01  1              5
2015-12-02  1              8
2015-12-04  1              6
2015-12-07  1              9
2015-12-01  2              5
2015-12-03  2             10
2015-12-04  2              6
2015-12-07  2             12
2015-12-09  2             11

这是我的代码:

df['date'] = pd.to_datetime(df['createdAt'])
df.set_index('date').resample('D', how='last', fill_method='ffill')

如果我使用相同的代码,这就是我所拥有的!我不希望与我约会的小组。

            createdAt   productId   popularity
date            
2015-12-01  2015-12-01  2              5
2015-12-02  2015-12-02  2              5
2015-12-03  2015-12-03  2             10
2015-12-04  2015-12-04  2              6
2015-12-05  2015-12-05  2              6
2015-12-06  2015-12-06  2              6
2015-12-07  2015-12-07  2             12
2015-12-08  2015-12-08  2             12
2015-12-09  2015-12-09  2             11

这就是我想要的!

createdAt   productId   popularity
2015-12-01  1               5
2015-12-02  1               8
2015-12-03  1               8
2015-12-04  1               6
2015-12-05  1               6
2015-12-06  1               6
2015-12-07  1               9
2015-12-01  2               5
2015-12-02  2               5
2015-12-03  2              10
2015-12-04  2               6
2015-12-05  2               6
2015-12-06  2               6
2015-12-07  2              12
2015-12-08  2              12
2015-12-09  2              11

怎么办? 谢谢

2 个答案:

答案 0 :(得分:0)

这会产生你想要的东西。

print df.groupby('productId', group_keys=False).apply(lambda df: df.resample('D').ffill()).reset_index()

    createdAt  productId  popularity
0  2015-12-01          1           5
1  2015-12-02          1           8
2  2015-12-03          1           8
3  2015-12-04          1           6
4  2015-12-05          1           6
5  2015-12-06          1           6
6  2015-12-07          1           9
7  2015-12-01          2           5
8  2015-12-02          2           5
9  2015-12-03          2          10
10 2015-12-04          2           6
11 2015-12-05          2           6
12 2015-12-06          2           6
13 2015-12-07          2          12
14 2015-12-08          2          12
15 2015-12-09          2          11

答案 1 :(得分:0)

试试这个,应该可行:)

print df.set_index('date').groupby('productId', group_keys=False).apply(lambda   
df: df.resample('D').ffill()).reset_index()