从大量数据中提取唯一的数据

2024-04-24 10:48:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常大的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

现在activityid2被完全排除在外,因为它属于两个url:Google和Yahoo。所以我想要的是找到所有只属于一个URL的活动,我想知道它们属于哪个URL。你知道吗

我想做的是:

创建词典

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

(这部分很慢,在这里得到了回答Parse a very large CSV dataset

有了这本词典,我将每个条目相互比较,找出集合之间的差异,并用差异结果更新相应的集合。你知道吗

我怎样才能用熊猫完成我想要的?你知道吗


Tags: csv数据ipcomhttpurl示例格式
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

另一个带有^{}的解决方案:

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

^{}^{}更快地解决问题:

df[df.groupby('ActivityId')['URL'].transform('nunique') == 1]
In [21]: df.groupby('ActivityId')['URL'].filter(lambda x: len(x.unique()) == 1)
Out[21]:
1    http://google.com/
Name: URL, dtype: object

相关问题 更多 >