gpt4 book ai didi

python - 数据框中的条件替换

转载 作者:行者123 更新时间:2023-12-01 00:51:21 24 4
gpt4 key购买 nike

我正在使用相当大的数据帧histdf(20M,3)。这些字段为 Visitor_IDcontenttime。该数据帧将用于 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 是 pandas 系列。索引是 Visitor_ID,值是 bool 值(如果原始数据框中包含该 Visitor_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 放入新的数据帧列中或完全消除这些行。

我很感激任何提示。谢谢。

最佳答案

您提取重度用户的访问者 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

关于python - 数据框中的条件替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56550413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com