web-dev-qa-db-ja.com

pandasを使用して日付ごとに値の頻度をカウントする

私が次の時系列を持っているとしましょう:

Timestamp              Category
2014-10-16 15:05:17    Facebook
2014-10-16 14:56:37    Vimeo
2014-10-16 14:25:16    Facebook
2014-10-16 14:15:32    Facebook
2014-10-16 13:41:01    Facebook
2014-10-16 12:50:30    Orkut
2014-10-16 12:28:54    Facebook
2014-10-16 12:26:56    Facebook
2014-10-16 12:25:12    Facebook
...
2014-10-08 15:52:49    Youtube
2014-10-08 15:04:50    Youtube
2014-10-08 15:03:48    Vimeo
2014-10-08 15:02:27    Youtube
2014-10-08 15:01:56    DailyMotion
2014-10-08 13:27:28    Facebook
2014-10-08 13:01:08    Vimeo
2014-10-08 12:52:06    Facebook
2014-10-08 12:43:27    Facebook
Name: summary, Length: 600

週と年ごとに各カテゴリ(時系列の一意の値/要素)をカウントしたいと思います。

Example:

    Week/Year      Category      Count
    1/2014         Facebook      12
    1/2014         Google        5
    1/2014         Youtube       2
...    
    2/2014         Facebook      2
    2/2014         Google        5
    2/2014         Youtube       20
...

Python pandasを使用してこれをどのように実現できますか?

22
jcborges

SeriesをDataFrameに変換し、Pandasのgroupby機能を使用するのが最も簡単な場合があります(すでにDataFrameをお持ちの場合は、スキップして以下の別の列を追加してください)。

シリーズがsと呼ばれている場合は、次のようにDataFrameに変換します。

_>>> df = pd.DataFrame({'Timestamp': s.index, 'Category': s.values})
>>> df
       Category           Timestamp
0      Facebook 2014-10-16 15:05:17
1         Vimeo 2014-10-16 14:56:37
2      Facebook 2014-10-16 14:25:16
...
_

次に、週と年の別の列を追加します(applyを使用して、週/年の数値の文字列を生成する方法があります)。

_>>> df['Week/Year'] = df['Timestamp'].apply(lambda x: "%d/%d" % (x.week, x.year))
>>> df
             Timestamp     Category Week/Year
0  2014-10-16 15:05:17     Facebook   42/2014
1  2014-10-16 14:56:37        Vimeo   42/2014
2  2014-10-16 14:25:16     Facebook   42/2014
...
_

最後に、_'Week/Year'_および_'Category'_でグループ化し、size()で集計してカウントを取得します。あなたの質問のデータについて、これは以下を生成します:

_>>> df.groupby(['Week/Year', 'Category']).size()
Week/Year  Category   
41/2014    DailyMotion    1
           Facebook       3
           Vimeo          2
           Youtube        3
42/2014    Facebook       7
           Orkut          1
           Vimeo          1
_
20
Alex Riley

もう少し明確にするために、最初に「week_num」という新しい列を作成する必要はありません。

df.groupby(by=lambda x: "%d/%d" % (x.week(), x.year())).Category.value_counts()

関数byは、インデックスの各タイムスタンプオブジェクトを自動的に呼び出して週と年に変換し、週と年でグループ化します。

3
Leon

TimeStamp列を週番号に変換し、その週番号とvalue_countカテゴリ変数を次のようにグループ化します。

df.groupby('week_num').Category.value_counts()

新しい列week_numがTimeStamp列から作成されたと想定しています。

2
cwharland