datafram中的条件替换

2024-10-03 09:12:49 发布

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

我使用的是相当大的数据帧histdf(20M,3)。字段是Visitor_IDcontenttime。dataframe将用于URL推荐系统,其中Visitor_ID是唯一的访问者标识,content是访问过的URL,time是时间戳

使用这种结构,每个唯一的访问者有多个url,但是有些访问者应该被丢弃,因为它们不会产生重要的信息(即,它们访问的url太少)

因此,我创建了一个名为user_visits的新变量,其中histdf.Visitor_ID中每个唯一值的行数,然后按大于10的计数对其进行过滤:

user_visits = histdf.Visitor_ID.value_counts()
mask_user = user_visits > 10

mask_user是熊猫系列。索引是Visitor\u ID,值是布尔值(如果原始数据帧中具有该Visitor\u ID的行多于10行,则为True)

现在我想在histdf中添加一个新列heavyuser,其中包含来自mask_user的True或False值

到目前为止,我所做的是使用以下代码在数据帧中设置值:

for index in histdf.index:
    temp = histdf.loc[index, 'Visitor_ID']
    temp2 = mask_user[temp]
    histdf.set_value(index, 'heavyuser', temp2)

这是一种工作。比按行使用iterrows或其他类型的迭代要快得多。但是,它仍然很慢,处理时间超过1小时

我想知道是否还有其他性能更好的选择。摘要将读取每个Visitor_ID的行数,如果这些行数小于阈值(在本例中为10),则在新的数据帧列中输入False或将这些行全部删除

如果有任何提示,我将不胜感激。谢谢


Tags: 数据idurlindextimevalue时间mask
1条回答
网友
1楼 · 发布于 2024-10-03 09:12:49

提取大量用户的访问者ID的第一直觉是好的,但是一旦有了它们,就不需要遍历数据帧

以下是您的方法:

histdf = pd.DataFrame({'Visitor_ID':[1, 1, 2, 2, 2, 3], 
                   'content ': ["url" + str(x) for x in range(6)], 
                   'time':["timestamp n° " + str(x) for x in range(6)]}) 

# At first we consider that no user is a heavy user
histdf['heavy user'] = False

# Then we extract the ID's of heavy users
user_visits = histdf.Visitor_ID.value_counts()
id_heavy_users = user_visits[user_visits > 1].index

# Finally we consider those users as heavy users in the corresponding column
histdf.loc[histdf['Visitor_ID'].isin(id_heavy_users), 'heavy user'] = True

输出:

  Visitor_ID content             time  heavy user
0           1     url0  timestamp n° 0        True
1           1     url1  timestamp n° 1        True
2           2     url2  timestamp n° 2        True
3           2     url3  timestamp n° 3        True
4           2     url4  timestamp n° 4        True
5           3     url5  timestamp n° 5       False

如果您只想保留问题末尾提到的大量用户,您可以这样做,而无需创建第三列:

histdf = pd.DataFrame({'Visitor_ID':[1, 1, 2, 2, 2, 3], 
                   'content ': ["url" + str(x) for x in range(6)], 
                   'time':["timestamp n° " + str(x) for x in range(6)]}) 

user_visits = histdf.Visitor_ID.value_counts()
id_heavy_users = user_visits[user_visits > 1].index

heavy_users = histdf[histdf['Visitor_ID'].isin(id_heavy_users)]

In [1] : print(heavy_users)
Out[1] :    Visitor_ID content             time
0           1     url0  timestamp n° 0
1           1     url1  timestamp n° 1
2           2     url2  timestamp n° 2
3           2     url3  timestamp n° 3
4           2     url4  timestamp n° 4

相关问题 更多 >