从大型数据集中提取唯一数据
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)
transform
和 boolean 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
【讨论】:
以上是关于从大型数据集中提取唯一数据的主要内容,如果未能解决你的问题,请参考以下文章