2016-04-04 5 views
1

私はこれのように見える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列にあるものは何でも無視)していないものも含め、特定の日付範囲に対して日付の出現を、カウントします。例えば、私はこのようになります日付範囲かもしれません:

date  count  
2015-06-13 3 
2015-06-14 0 
2015-06-15 2 
2015-06-16 0 

私はそのすべての機能を見つけることができませんでした。そして、

periods = pd.date_range('2015-06-13', '2015-06-16', freq = 'd') 

を、私のようなものに見える出力をしたいです0の行を維持してください。

答えて

2

私は、あなたが最初に0によってfillnaperiodsによってvalue_counts、その後reindexの列dateからdateを使用することができると思います。最終変換floatastypereset_indexによって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

これは@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 

注:パンダ0.18.0で再インデックス操作では、countのタイプがintからfloatに変更されるため、そのバージョンを使用している場合は最後に.astype(int)をタックする必要があります。

+0

私はあなたの解決策を試して、私は 'int'の' float'値をinstaedしています。どうして? 'python 2.7.10'なので?または列の 'NaN'のため?または、他の何か?どう思いますか?私の解決策も 'float'を返します。面白い。 – jezrael

+0

私はpandas 0.17.1とPython 2.7.11を実行しています。 – Alexander

+0

うん、私は 'pandas'' 0.18.0'を使用します。たぶん違いがあります。ありがとうございました。 – jezrael

関連する問題