从大型数据集中提取唯一数据

Posted

技术标签:

【中文标题】从大型数据集中提取唯一数据【英文标题】:Extract unique data from a large dataset 【发布时间】:2017-10-08 22:30:27 【问题描述】:

我有一个非常大的 CSV 数据集(900M 记录),包含以下格式:

URL | IP | ActivityId

样本数据:

http://google.com/ | 127.0.0.1 | 2
http://google.com/ | 12.3.3.1 | 1

对于这种格式,我希望获取每个 URL 的所有唯一活动,这些活动不会出现在其他 URL 中。

例如,让我们在上面提供的数据中再添加一个样本

http://yahoo.com/ | 123.4.5.1 | 2

现在 ActivityId 2 完全被排除在外,因为它属于两个网址:Google 和 Yahoo。所以我想要的是找到所有只属于一个 URL 的活动,并且我想知道它们所属的 URL。

我想做什么:

创建字典

URL => set(activity1, activity2, ... , activityN)

(这部分比较慢,在这里回复Parse a very large CSV dataset)

通过这本词典,我将每个条目相互比较,发现集合之间的差异,并用差异结果更新相应的集合。

如何使用 pandas 完成我想要的?

【问题讨论】:

【参考方案1】:

nunique 的另一种解决方案:

df.groupby('ActivityId')['URL'].filter(lambda x: x.nunique() == 1)

transformboolean indexing 的更快解决方案:

df[df.groupby('ActivityId')['URL'].transform('nunique') == 1]

【讨论】:

【参考方案2】:
In [21]: df.groupby('ActivityId')['URL'].filter(lambda x: len(x.unique()) == 1)
Out[21]:
1    http://google.com/
Name: URL, dtype: object

【讨论】:

【参考方案3】:

如果您还想知道属于单个 URL 的 ActivityID,这是一个解决方案:

假设您有以下数据集:

    URL                 IP          ActivityId
0   http://google.com/  127.0.0.1   2
1   http://google.com/  12.3.3.1    1
2   http://yahoo.com/   123.4.5.1   2
3   http://yahoo.com/   123.4.5.1   5

你可以这样做:

In[1]:groups = df.groupby('ActivityId')['URL']
      for name, group in groups:
          if group.size == 1:
              print (name,group.values[0])

Out[2]:1 http://google.com/ 
       5 http://yahoo.com/ 

同时使用:

df.groupby('ActivityId')['URL'].filter(lambda x: len(x.unique()) == 1)

产量:

1    http://google.com/ 
3     http://yahoo.com/ 
Name: URL, dtype: object

【讨论】:

以上是关于从大型数据集中提取唯一数据的主要内容,如果未能解决你的问题,请参考以下文章

从大型数据集中采样

查找两个大型数据集之间的最近坐标

为基于 2D 条件的子集索引大型 3D HDF5 数据集

使用报表查看器,如何从两个单独的数据集中提取

从COCO数据集和VOC数据集提取特定的类别

对从大型数据集中聚合的数据使用 Altair