使用groupby和resample对熊猫进行升采样

时间:2019-01-29 13:24:22

标签: python pandas pandas-groupby

我将时间序列与间隔分组。我不想填补空白,尊重分组。

date在每个id中都是唯一的。

以下方法有效,但是给了我零,而我不需要NaN。

data.groupby('id').resample('D', on='date').sum()\
    .drop('id', axis=1).reset_index()

以下出于某些原因不起作用

data.groupby('id').resample('D', on='date').asfreq()\
    .drop('id', axis=1).reset_index()

data.groupby('id').resample('D', on='date').fillna('pad')\
    .drop('id', axis=1).reset_index()

我收到以下错误: Upsampling from level= or on= selection is not supported, use .set_index(...) to explicitly set index to datetime-like

我尝试将pandas.Grouperset_index一起使用多级索引或单级索引,但是它似乎并未对我的日期列进行升采样,因此我得到了连续的日期,或者它不尊重{{1} }列。

Pandas版本为0.23

尝试一下:

id

1 个答案:

答案 0 :(得分:1)

创建DatetimeIndex并从on中删除参数resample

print (data.set_index('date').groupby('id').resample('D').asfreq())
                id
id date           
1  2018-01-01  1.0
   2018-01-02  NaN
   2018-01-03  NaN
   2018-01-04  NaN
   2018-01-05  1.0
   2018-01-06  NaN
   2018-01-07  NaN
   2018-01-08  NaN
   2018-01-09  NaN
   2018-01-10  1.0
2  2018-01-01  2.0
   2018-01-02  NaN
   2018-01-03  NaN
   2018-01-04  NaN
   2018-01-05  2.0
   2018-01-06  NaN
   2018-01-07  NaN
   2018-01-08  NaN
   2018-01-09  NaN
   2018-01-10  2.0

print (data.set_index('date').groupby('id').resample('D').fillna('pad'))
#alternatives
#print (data.set_index('date').groupby('id').resample('D').ffill())
#print (data.set_index('date').groupby('id').resample('D').pad())
               id
id date          
1  2018-01-01   1
   2018-01-02   1
   2018-01-03   1
   2018-01-04   1
   2018-01-05   1
   2018-01-06   1
   2018-01-07   1
   2018-01-08   1
   2018-01-09   1
   2018-01-10   1
2  2018-01-01   2
   2018-01-02   2
   2018-01-03   2
   2018-01-04   2
   2018-01-05   2
   2018-01-06   2
   2018-01-07   2
   2018-01-08   2
   2018-01-09   2
   2018-01-10   2

编辑:

如果要使用缺少值的sum,则需要min_count=1参数-sum

  

最小计数:整数,默认为0   执行操作所需的有效值数量。如果存在少于min_count个非NA值,则结果将为NA。

     

0.22.0版中的新增功能:添加了默认值0。这表示全NA或空系列的总和为0,全NA或空系列的乘积为1。

print (data.groupby('id').resample('D', on='date').sum(min_count=1))