2017-12-18 255 views
1

我有这样的数据集,大熊猫分组数据帧 - 蟒

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 

这是一个组合数据集,由不同的供应商所提供的数据,对每个销售没有共同的标识符。这里的问题是每个数据提供者在每次销售时都会有略微不同的日期和价格。所以我试图将它们组合在一起作为单组销售。因此,这里的业务逻辑是数据提供者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

'18/10/15'和“11/11/15”都在一个月内,价格差异在10美元。他们是同样的销售? – srig

+0

没有。因为他们有不同的product_id。 PRODUCT_ID应该被视为相同的销售。 –

+0

'19/05/14'和'16/06/14'具有相同的PRODUCT_ID,都在一个月内,价格差异为10美元,并且是相同的销售。他们的销售ID是否需要按顺序排列? – srig

回答

1

我们可以使用groupbysort_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(),是getthing一个月内组日期

(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

+0

让我们[在聊天中继续讨论](http://chat.stackoverflow.com/rooms/161557/discussion-between-ds-user-and-wen)。 –

+0

@ds_user对不起,我不能使用聊天,你可以改成'df ['SALE_DATE']。diff()/ np.timedelta64(1,'D')'这部分lt(50)是处理垃圾箱大小 – Wen

+0

对不起,我还是不明白这一点。所以要提到一天的差异,我必须单独修改'lt',或者将np.timedelta64(1,'D')修改为np.timedelta64(50,'D')。它是否正确 ? (1,'D'))。(50).ne(1).cumsum(),df ['net_sale_price']。pct_change ().lt(0.1).ne(1).cumsum()'? –