我有一个大表,如下所示:
+---+---------+----------+-------+---------+------------+
| | cust_id | order_id | quant | revenue | date |
+---+---------+----------+-------+---------+------------+
| 0 | 103502 | 107801 | 1 | 246.5 | 2014-07-15 |
| 1 | 110301 | 108001 | 2 | 106.0 | 2014-07-15 |
| 2 | 110301 | 108101 | 2 | 106.0 | 2014-07-15 |
| 3 | 111401 | 108201 | 2 | 408.5 | 2014-07-15 |
| 4 | 111502 | 108301 | 1 | 196.0 | 2014-07-15 |
+---+---------+----------+-------+---------+------------+
对于购买多次(相同cust_id)的客户,我正在尝试将数据分组在一起,以找到每个数据的最早和最晚日期。例如,在2014-6-30和2013-6-30购买cust_id 123456。对于我的场景,我希望365天的输出。
这是我会使用groupby
然后应用函数吗?我尝试为cust_id和date列做一个groupby
,但我得到了一个对象,所以我不确定它是否格式正确。
答案 0 :(得分:2)
好的,让我们从groupby
开始做什么。
(我更改了您的数据,以便为您提供不同的日期,因为如果它们完全相同,则不是很有趣。)
>>> d={'cust_id': (103502,110301,110301,111401,111502),
... 'order_id': (107801,108001,108101,108201,108301),
... 'quant': (1,2,2,2,1),
... 'revenue': (246.5,106.0,106.0,408.5,196.0),
... 'date': [datetime.datetime.strptime(dt, '%Y-%m-%d') for dt in
... ('2014-07-15', '2014-07-16', '2014-07-17', '2014-07-18', '2014-07-19')]}
>>> df = pd.DataFrame(d)
>>> df
cust_id date order_id quant revenue
0 103502 2014-07-15 107801 1 246.5
1 110301 2014-07-16 108001 2 106.0
2 110301 2014-07-17 108101 2 106.0
3 111401 2014-07-18 108201 2 408.5
4 111502 2014-07-19 108301 1 196.0
>>> gb = df.groupby('cust_id')
>>> gb.groups
{111401: [3], 111502: [4], 110301: [1, 2], 103502: [0]}
这很清楚:每个cust_id都有一组关联的行。
那么,我们能做些什么呢?好吧,就像您可以访问DataFrame的列来获取Series一样,您可以访问DataFrameGroupBy的列来获取SeriesGroupBy。然后在这些列上调用聚合方法,这为每个组提供一个值:
>>> gb['date'].max()
cust_id
103502 2014-07-15
110301 2014-07-17
111401 2014-07-18
111502 2014-07-19
Name: date, dtype: datetime64[ns]
那么,(我认为)你想要的是:
>>> gb['date'].max() - gb['date'].min()
cust_id
103502 0 days
110301 1 days
111401 0 days
111502 0 days
Name: date, dtype: timedelta64[ns]
答案 1 :(得分:0)
如果从数据库表中获取这些数据,并且该表名称为t1,则以下查询将给出日期差异。
select t1.cust_id,max(t2.date)-min(t1.date) from t1, t1 as t2 where t1.cust_id=t2.cust_id group by t1.cust_id;