2017-12-18 251 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()'? –