我有DataFrame
看起来像这样。
date name
0 2015-06-13 00:21:25 a
1 2015-06-13 01:00:25 b
2 2015-06-13 02:54:48 c
3 2015-06-15 14:38:15 a
4 2015-06-15 15:29:28 b
我想计算针对特定日期范围的日期的出现次数,包括未出现在列中的日期(并忽略name
列中的任何内容)。例如,我的日期范围可能如下所示:
periods = pd.date_range('2015-06-13', '2015-06-16', freq = 'd')
然后,我想要一个类似于:
的输出date count
2015-06-13 3
2015-06-14 0
2015-06-15 2
2015-06-16 0
我无法找到让我保留0
行的任何功能。
答案 0 :(得分:2)
我认为您可以先使用date
列中的date
value_counts
然后reindex
periods
fillna
astype
0
}}。最后由reset_index
和将float
转换为int
:
df = df['date'].dt.date.value_counts()
print df
2015-06-13 3
2015-06-15 2
Name: date, dtype: int64
periods = pd.date_range('2015-06-13', '2015-06-16', freq = 'd')
df = df.reindex(periods).fillna(0).astype(int).reset_index()
df.columns = ['date','count']
print df
date count
0 2015-06-13 3
1 2015-06-14 0
2 2015-06-15 2
3 2015-06-16 0
答案 1 :(得分:1)
这与@jezrael的解决方案非常相似,但使用groupby而不是value_counts:
>>> (pd.DataFrame(df.groupby(df.date.dt.date)['name']
.count()
.reindex(periods)
.fillna(0))
.rename(columns={'name': 'count'}))
count
2015-06-13 3
2015-06-14 0
2015-06-15 2
2015-06-16 0
注意:在Pandas 0.18.0中,reindex操作会将计数类型从整数更改为浮点数,因此,如果您使用的是该版本,则需要将.astype(int)
添加到最后。