如何将value_counts应用于分组对象

时间:2016-12-14 13:19:50

标签: python pandas

我的表格看起来像这样:

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上执行,而不是在每个组上执行。

1 个答案:

答案 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