如何根据特定列表计算频率?

时间:2016-04-04 05:17:48

标签: python pandas dataframe

我有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行的任何功能。

2 个答案:

答案 0 :(得分:2)

我认为您可以先使用date列中的date value_counts然后reindex periods fillna astype 0 }}。最后由reset_indexenter image description herefloat转换为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)添加到最后。