2016-04-16 250 views
2

我有幾百萬廣告ID行的數據幀從連續兩天在網站刮進行計算,其格式爲:熊貓數據幀上重複的行

ad-id   Date scraped 
SSE-AD-3469148 15-Apr 
OAG-AD-12583686 15-Apr 
OAG-AD-10476872 15-Apr 
SSE-AD-3037758 15-Apr 
OAG-AD-12583686 16-Apr 
OAG-AD-10476872 16-Apr 
SSE-AD-3037758 16-Apr 
OAG-AD-10476872 17-Apr 
SSE-AD-3037758 17-Apr 

我要輸出的獨特廣告ID唯一,但我需要知道每個廣告ID的開始和結束日期刮,像這樣:

ad-id   First scrape Last Scrape 
SSE-AD-3469148 15-Apr   15-Apr 
OAG-AD-12583686 15-Apr   16-Apr 
OAG-AD-10476872 15-Apr   17-Apr 
SSE-AD-3037758 15-Apr   17-Apr 

什麼是生產這種利用大熊貓的最長時間有效的方式?我只能想到涉及幾百萬行的循環會非常緩慢的方式。

+0

我覺得有一些'max'和'min'功能,但它仍然需要解析幾百萬日期,什麼可比性。 –

回答

1

我只能希望你有真正的日期而不是「17-Apr」作爲文本值。

首先按日期排序,然後在ad-id上執行groupby取第一個和最後一個值可能是最有效的。

您可以通過選擇不對結果進行排序來稍微提高速度,例如, df.groupby('ad-id', sort=False)...

df.sort_values('Date scraped', inplace=True) 
>>> df.groupby('ad-id')['Date scraped'].agg({'First Scrape': 'first', 'Last Scrape': 'last'}) 

        Last Scrape First Scrape 
ad-id          
    OAG-AD-10476872  17-Apr  15-Apr 
    OAG-AD-12583686  16-Apr  15-Apr 
    SSE-AD-3037758  17-Apr  15-Apr 
    SSE-AD-3469148  15-Apr  15-Apr 

計時用1萬條記錄

np.random.seed(0) 
ad_id = ['SSE-' + str(i) for i in np.random.random_integers(1, 500, 1000000)] 
ts = pd.to_datetime(['{0}-{1}-{2}'.format(year, month, day) for year, month, day in zip(years, months, days)]) 
df = pd.DataFrame({'ad-id': ad_id, 'Date scraped': ts}) 

%%timeit -n 10 
df.sort_values('Date scraped', inplace=True) 
df.groupby('ad-id')['Date scraped'].agg({'First Scrape': 'first', 'Last Scrape': 'last'}) 
10 loops, best of 3: 277 ms per loop 

>>> df.groupby('ad-id')['Date scraped'].agg({'First Scrape': 'first', 'Last Scrape': 'last'}).head() 
     Last Scrape First Scrape 
ad-id       
SSE-1 2015-12-28 2000-01-02 
SSE-10 2015-12-25 2000-01-01 
SSE-100 2015-12-25 2000-01-01 
SSE-101 2015-12-26 2000-01-05 
SSE-102 2015-12-28 2000-01-01 

# Slightly faster if you don't sort the results. 
%%timeit -n 10 
df.sort_values('Date scraped', inplace=True) 
df.groupby('ad-id', sort=False)['Date scraped'].agg({'First Scrape': 'first', 'Last Scrape': 'last'}) 
10 loops, best of 3: 268 ms per loop 
+0

亞歷山大,實際上有很多額外的列,我沒有包含在OP中。每個額外的列應該是唯一的廣告ID,所以我想我可以groupby所有額外的列,但是有一種普遍的方式來保留這些額外的列? – Testy8

+0

'df2 = df.groupby('ad-id')。first()''df2.rename(columns = {'Date scraped':'First Scrape'})''last_scrape = df.groupby('ad-id ''''''''''''''''df2 = df2.join(last_scrape)'' – Alexander