Python 数据帧在重复行上执行计算
我有一个数据框,连续几天从网站上抓取数百万行广告ID,格式如下:Python 数据帧在重复行上执行计算,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框,连续几天从网站上抓取数百万行广告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-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
用熊猫生产这种食物最省时的方法是什么?我只能想到涉及循环的方法,这对于几百万行来说将是非常缓慢的。我只能希望你有真实的日期,而不是“4月17日”作为文本值 最有效的方法可能是首先按日期排序,然后对
ad id
执行groupby
,获取第一个和最后一个值
通过选择不对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
有100万条记录的计时
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
功能,但仍然需要将数百万个日期解析为可比较的内容。Alexander,实际上有很多额外的列我没有包括在OP中。每个额外的列都应该是广告id所特有的,所以我想我可以根据所有额外的列进行分组,但是有没有一种通用的方法来保留这些额外的列呢?df2=df.groupby('ad-id').first()
df2.rename(列={'Date scraped':'first Scrape'})
last\u Scrape=df.groupby('ad-id')['Date scraped'].agg({'last Scrape':'last'})
df2=df2.join(最后一次刮伤)