我有一个如下所示的数据框:
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
第一列是用户ID,第二列是日期(由groupby(pd.TimeGrouper(' d')生成),第三列是每日计数。但是,每列用户,我想确保用户的最小和最大日期之间缺少的任何日期在每个用户的基础上填写为0。所以,如果我开始使用如上所述的数据框,我最终会使用这样的数据框:
grouped_users = user_daily_counts.groupby('user').set_index('timestamp').resample('d', fill_method = None)
我知道有多种方法可以使用pandas数据帧进行重新采样(使用选项进行向前,向后或平均进行插值)但是我如何在上面的意义上执行此操作,我希望连续时间每个用户ID的系列,但每个用户的时间序列日期不同?
这是我尝试过的没有用的东西:
AttributeError: Cannot access callable attribute 'set_index' of 'DataFrameGroupBy' objects, try using the 'apply' method
然而,这会引发错误apply
。我不确定我是如何使用String sSql = "CREATE TABLE [" + sDatabaseName + "].[" + sSchema + "].[" + sTableName + "] (" + sSqlFields + ")";
Session session = getSession();
Query q = session.createSQLQuery(sSql);
q.executeUpdate();
方法,同时提出我想做的所有列。
感谢您的任何建议!
答案 0 :(得分:5)
您可以将groupby
与resample
一起使用,但首先需要set_index
创建的Datetimeindex
。
(need pandas 0.18.1 and higher
)
然后NaN
用asfreq
0
填充userid
。
上次删除列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
和fillna
:
count
如果想要列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
的dtype整数添加reset_index
:
map(x->x[2], S)