2016-04-18 6 views
2

Pandasを使用して、毎日新しいユーザーの数を計算したいという、次のデータが与えられています。Pandasで毎日見られる新しいIDの数を計算する

Data: 
    Day | UserID 
    ---------- 
    1 | A 
    1 | B 
    1 | C 
    1 | C 
    ---------- 
    2 | A 
    2 | B 
    2 | D 
    2 | A 
    2 | E 
    ---------- 
    3 | B 
    3 | D 
    3 | F 

Result:  
    Day | New Users 
    --------------- 
    1 | 3 
    2 | 2 
    3 | 1 

私はそれを見る方法、手順は次のとおりです。

  1. 計算日あたりの最大ユーザーID:df.groupby( '日')UserID.max()
  2. 前日の最大ユーザーID(0で初期化)でデータをフィルタリングします。ここで私はパンダを使ってこれを行う方法がありません
  3. フィルタリングされたデータセット上の一意のユーザーからのサインイン数を計算します。 df.filtered.groupby( '日')。UserID.nunique()

これを達成するためのクリーンな方法はありますか?

答えて

6

これは、各IDが最初に表示され、その日までにグループ化され、対応する行がカウントされる日を示す表として作成されます。データフレームを想定し

df = pd.DataFrame([(1, "A"), (1, "B"), 
        (1, "C"), (1, "C"), 
        (2, "A"), (2, "B"), 
        (2, "D"), (2, "A"), 
        (2, "E"), (3, "B"), 
        (3, "D"), (3, "F")], 
        columns=["day", "userid"]) 

(df 
    .sort_values('day') 
    .groupby('userid') 
    .first() 
    .rename(columns={"day": "first_seen"}) 
    .groupby('first_seen').size() 
) 
+0

きちんとし。ありがとうございました! – bsuire

1

は、まずあなたがUserID上のグループ(as_index=Falseを設定する)ことができ、Dayでソートし、次にDayに結果のインデックスを設定されています。これにより、毎日新しいユーザーが1人ずつ追加されます。

df2 = df.groupby('UserID', as_index=False).Day.first().set_index('Day') 
>>> df2 
    UserID 
Day  
1  A 
1  B 
1  C 
2  D 
2  E 
3  F 

、新しいユーザーの合計数を取得するには:

>>> df2.groupby(level=0).UserID.count() 
Day 
1 3 
2 2 
3 1 
Name: UserID, dtype: int64 
関連する問題