我只能希望你有真正的日期而不是「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
我覺得有一些'max'和'min'功能,但它仍然需要解析幾百萬日期,什麼可比性。 –