hel*_*loB 3 python time-series pandas
我有一个看起来像这样的数据框:
userid date count
a 2016-12-01 4
a 2016-12-03 5
a 2016-12-05 1
b 2016-11-17 14
b 2016-11-18 15
b 2016-11-23 4
Run Code Online (Sandbox Code Playgroud)
第一列是用户ID,第二列是日期(由groupby(pd.TimeGrouper('d')生成),第三列是每日计数.但是,对于每个用户,我想确保用户的最小和最大日期之间缺少的任何日期都按每个用户填充为0.因此,如果我从上面的数据框开始,我最终得到如下数据框:
userid date count
a 2016-12-01 4
a 2016-12-02 0
a 2016-12-03 5
a 2016-12-04 0
a 2016-12-05 1
b 2016-11-17 14
b 2016-11-18 15
b 2016-11-19 0
b 2016-11-20 0
b 2016-11-21 0
b 2016-11-22 0
b 2016-11-23 4
Run Code Online (Sandbox Code Playgroud)
我知道有许多方法可以使用pandas数据帧进行重新采样(使用选项来选择向前,向后或平均进行插值)但是我将如何在上面的意义上执行此操作,我希望每个方法都有连续的时间序列userid但是每个用户的时间序列的日期不同?
这是我尝试过的没有用的东西:
grouped_users = user_daily_counts.groupby('user').set_index('timestamp').resample('d', fill_method = None)
但是这会引发错误AttributeError: Cannot access callable attribute 'set_index' of 'DataFrameGroupBy' objects, try using the 'apply' method.我不确定如何apply在提出所有列的同时使用该方法,就像我想做的那样.
谢谢你的任何建议!
您可以使用groupby同resample,但首先需要Datetimeindex通过创建set_index.
(need pandas 0.18.1 and higher)
最后删除列userid和reset_index:
df = df.set_index('date')
.groupby('userid')
.resample('D')
.asfreq()
.fillna(0)
.drop('userid', axis=1)
.reset_index()
print (df)
userid date count
0 a 2016-12-01 4.0
1 a 2016-12-02 0.0
2 a 2016-12-03 5.0
3 a 2016-12-04 0.0
4 a 2016-12-05 1.0
5 b 2016-11-17 14.0
6 b 2016-11-18 15.0
7 b 2016-11-19 0.0
8 b 2016-11-20 0.0
9 b 2016-11-21 0.0
10 b 2016-11-22 0.0
11 b 2016-11-23 4.0
Run Code Online (Sandbox Code Playgroud)
如果想要列count整数的dtype 添加astype:
df = df.set_index('date') \
.groupby('userid') \
.resample('D') \
.asfreq() \
.fillna(0) \
.drop('userid', axis=1) \
.astype(int) \
.reset_index()
print (df)
userid date count
0 a 2016-12-01 4
1 a 2016-12-02 0
2 a 2016-12-03 5
3 a 2016-12-04 0
4 a 2016-12-05 1
5 b 2016-11-17 14
6 b 2016-11-18 15
7 b 2016-11-19 0
8 b 2016-11-20 0
9 b 2016-11-21 0
10 b 2016-11-22 0
11 b 2016-11-23 4
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
713 次 |
| 最近记录: |