我的表格看起来像这样:
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
在value_counts
上应用earliest_purcahse_date
以获取:
2016-08-01 3
我该怎么做?我不知道转型后该怎么做。
P.S。我尝试df.groupby(userid).purchase_date.transform(min).value_counts()
此操作在整个df
上执行,而不是在每个组上执行。
答案 0 :(得分:0)
我认为您需要groupby
idxmin
才能获得indices
每个组的最小值,并选择loc
:
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