我有这个数据集,
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
我如何在熊猫中实现这一点,有人可以帮忙吗?感谢。
答案 0 :(得分:1)
我们可以在groupby
sort_values
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
来获取组ID