分组数据帧-python
我有这个数据集分组数据帧-python,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有这个数据集 PRODUCT_ID SALE_DATE SALE_PRICE PROVIDER 1 01/02/16 25 1 1 02/10/16 60 1 1 01/11/16 63 2 1 09/10/16 65 3 2 11/11/15 54 1 2
PRODUCT_ID SALE_DATE SALE_PRICE PROVIDER
1 01/02/16 25 1
1 02/10/16 60 1
1 01/11/16 63 2
1 09/10/16 65 3
2 11/11/15 54 1
2 13/01/16 34 2
3 19/05/14 45 1
3 15/10/15 38 1
3 16/06/14 53 2
3 18/10/15 58 2
这是一个组合数据集,数据由不同的提供商提供,每个销售没有共同的标识符。这里的问题是,每个数据提供商的每次销售的日期和价格略有不同。因此,我试图将它们分组为一个组ID,因此这里的业务逻辑是数据提供者1首先获得销售数据,因此对于产品ID,如果供应商2或3的销售日期在1个月的时间内,并且价格在10美元差异(或多或少)内,我们认为它们是相同的销售,否则将被视为不同的销售。因此,输出应该如下所示:
PRODUCT_ID SALE_DATE SALE_PRICE PROVIDER SALE_GROUP_ID
1 01/02/16 25 1 1
1 02/10/16 60 1 2
1 01/11/16 63 2 2
1 09/10/16 65 3 2
2 11/11/15 54 1 3
2 13/01/16 34 2 4
3 19/05/14 45 1 5
3 15/10/15 38 1 6
3 16/06/14 53 2 5
3 18/10/15 58 2 7
我如何在熊猫身上做到这一点,有人能帮忙吗?谢谢。我们可以在
排序\u值之后使用groupby
df.SALE_DATE=pd.to_datetime(df.SALE_DATE,format='%d/%m/%y')
df=df.sort_values(['PRODUCT_ID','SALE_DATE','SALE_PRICE'])
df1=df.copy()
df1=df.copy().sort_index()
df1['SALE_GROUP_ID']=df.groupby([df['PRODUCT_ID'],(df['SALE_DATE'].diff().abs()/np.timedelta64(1, 'M')).lt(1).ne(1).cumsum(),df['SALE_PRICE'].diff().lt(10).ne(1).cumsum()]).ngroup().add(1).sort_index().values
df1
Out[294]:
PRODUCT_ID SALE_DATE SALE_PRICE PROVIDER SALE_GROUP_ID
0 1 2016-02-01 25 1 1
1 1 2016-10-02 60 1 2
2 1 2016-11-01 63 2 2
3 1 2016-10-09 65 3 2
4 2 2015-11-11 54 1 3
5 2 2016-01-13 34 2 4
6 3 2014-05-19 45 1 5
7 3 2015-10-15 38 1 6
8 3 2014-06-16 53 2 5
9 3 2015-10-18 58 2 7
更多信息:获取组时需要3个条件
1. PRODUCT_ID
2. Date different within in 1 month
3. SALE_PRICE different less than 10
(df['SALE_DATE'].diff().abs()/np.timedelta64(1,'M')).lt(1).ne(1).cumsum()
,用于在一个月内获取日期组
(df['SALE_DATE'].diff().abs()/np.timedelta64(1, 'M')).lt(1).ne(1).cumsum()
Out[274]:
0 1
1 2
3 2
2 2
4 3
5 4
6 5
8 5
7 6
9 6
Name: SALE_DATE, dtype: int32
df['SALE_PRICE'].diff().lt(10).ne(1).cumsum()
将在10内获取值
df['SALE_PRICE'].diff().lt(10).ne(1).cumsum()
Out[275]:
0 1
1 2
3 2
2 2
4 2
5 2
6 3
8 3
7 3
9 4
Name: SALE_PRICE, dtype: int32
在groupby
之后,我们只需组合(获得每个组条件的交集),然后我们使用ngroup
获得组Id18/10/15
和11/11/15
在一个月内,并且有10美元的价差。它们是一样的吗?不是。因为他们有不同的产品id。产品id应该是相同的,才能视为相同的销售。19/05/14
和16/06/14
有相同的产品id,在一个月内,价差为10美元,并且是相同的销售。他们的销售ID是否需要按顺序排列?是的,这就是为什么他们被视为相同的销售。产品ID相同,一个月内有10美元的差异。因此被认为是相同的销售,销售组id相同。不,它们不需要按顺序排列。让我们。@ds\u用户对不起,我不能使用聊天,您可以更改为df['SALE\u DATE'].diff()/np.timedelta64(1,'D')
这部分lt(50)是用来处理仓位大小的,我仍然不明白这一点。所以为了提到日差,我必须单独修改'lt',或者这也是np.timedelta64(1,'D')到np.timedelta64(50,'D')。这是正确的吗df['sale_date'].diff().abs()/np.timedelta64(1,'D')).lt(50).ne(1).cumsum(),df['net_sale_price'].pct_change().lt(0.1).ne(1).cumsum()
?@ds_user您只需要np.timedelta64(1,'D'),这是将days对象转换为int