python - Pandas 数据框对重复行执行计算

标签 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-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

使用 Pandas 生成此内容最省时的方法是什么?我只能想到涉及循环的方法,对于几百万行来说会非常慢。

最佳答案

我只希望您有真实的日期,而不是将“17-Apr”作为文本值。

首先按日期排序,然后对 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

关于python - Pandas 数据框对重复行执行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36659820/

相关文章:

python - Pandas:如何从另一列设置日期时间的小时数?

python - 在 python、opencv2、numpy 中获取图像蒙版上特征位置的索引

python - 如何在 Python 中为协变可变集合类类使用类型提示?

Pandas groupby 变换 : multiple functions applied at the same time with custom names

python - 如何在 pandas Series 对象上并行化 `map` 函数?

python - Pandas Dataframe 具有各种列标准的求和函数

python - 在Python/Pandas中创建部分SAS PROC Summary替换

python - 在python中提取URL的信息部分

python - Pandas 使用其他不规则时间列表对不规则时间序列进行重新采样和插值

Python按索引连接数据框