2016-12-14 9 views
1

にvalue_countsを適用する方法:私は、各ユーザーの購入履歴を追跡しています私はこのようになりますテーブル持ってグループ化されたオブジェクト

userid purchase_date 
    1 2016-08-01 
    1 2016-08-02 
    2 2016-08-01 
    2 2016-08-01 
    3 2016-08-01 
    3 2016-08-02 
    3 2016-08-03 

を(ユーザーが複数回に一日を購入することができます)。今、私は、ユーザーが購入した最も早い日付を見つけたいので、私はこれをしなかった:

df.groupby(userid).purchase_date.transform(min) 

は今、私はそれぞれの最も初期の購入日を持っています。次のことは、value_countを適用することです。私はこれを見ることを期待:

userid earliest_purchase_date 
    1 2016-08-01 
    2 2016-08-01 
    3 2016-08-01 

が取得するearliest_purcahse_datevalue_countsを適用します。

2016-08-01 3 

はどのように私はそれを行うことができますか?私は変身後に何をすべきか分かりません。

P.S.私はdf.groupby(userid).purchase_date.transform(min).value_counts()を試しましたが、この操作は各グループではなく、df全体で実行されています。

答えて

0

私はlocで選択してグループごとに、最小値のindicesを得るためにあなたがidxmingroupbyが必要だと思う:

print (df.groupby('userid')['purchase_date'].idxmin()) 
userid 
1 0 
2 2 
3 4 
Name: purchase_date, dtype: int64 

df = df.loc[df.groupby('userid')['purchase_date'].idxmin()] 
print (df) 
    userid purchase_date 
0  1 2016-08-01 
2  2 2016-08-01 
4  3 2016-08-01 

そして最後value_counts

print (df.purchase_date.value_counts()) 
2016-08-01 3 
Name: purchase_date, dtype: int64 

必要がある場合はどのように多くの極小値カウントグループあたり:

df = df.groupby('userid')['purchase_date'] 
     .apply(lambda x: pd.Series([len(x[x == x.min()]),x.min()],index=['count','min date'])) 
     .unstack() 
print (df) 

     count    min date 
userid       
1   1 2016-08-01 00:00:00 
2   2 2016-08-01 00:00:00 
3   1 2016-08-01 00:00:00 
+0

'idxmin()'しようとしましたが、 'TypeError:float()引数が 'datetime.date'ではなく文字列または数字でなければなりません。 – Cheng

+0

' print(df.purchase_date.dtypes)とは何ですか? 'datetime'か' object'ですか? – jezrael

+0

'dtype( 'O')' – Cheng

関連する問題