本次记录主要实现对每行进行排序,并保留前80%以前的偏好。思路:将每行的概率进行排序,然后累加,累加值小于等于0.8的偏好保留,获得一个累加过滤的dataframe,然后映射回原始数据中,保留每行的偏好。接下来是代码的实现
a = [[0.2, 0.35, 0.45], [0.1,0.2, 0.7], [0.3, 0.5, 0.2]]
data = pd.DataFrame(a, index=['user1','user2','user3'], columns=["a", "b", "c"])
sum_df=[]
for index,row in data.iterrows():
df = row.sort_values(ascending=False).cumsum()
if df[0]>0.8:
new_df = df[:1]
else:
new_df = df[df<=0.8]
sum_df.append(new_df)
sum_df = pd.DataFrame(sum_df)
print(sum_df)
这是累加之后每个用户保留的前80%偏好的类型,接下来如何将这个特征映射回去,将累加后的dataframe通过空值将其转化为0-1dataframe,再和原数据集一一对应相乘,就可以映射回去了,代码如下
d = (sum_df.notnull())*1
print(d)
final_df = d*data #将保留地特征映射到原始数据中
print(final_df)
本节内容目标明确,实现了每个用户的前80%偏好,不知道正在看的小伙伴有没有懂?可以一起讨论哦!
接下来,考虑优化这个实现的代码,前面的思路是通过两个dataframe相乘实现的,当数据集非常大的时候,效率很低,于是不用list,利用字典的形式实现
sum_df=[]
for index,row in data.iterrows():
df = row.sort_values(ascending=False).cumsum()
origin = row.to_dict() #原始每个用户值
if df[0]>0.8:
new_df = df[:1]
else:
new_df = df[df<=0.8]
name = new_df.name #user
tmp = new_df.to_dict()
for key in tmp.keys(): # 原始值映射
tmp[key] = origin[key]
tmp['user'] = name
sum_df.append(tmp)
sum_df = pd.DataFrame(sum_df).set_index('user').fillna(0)
print(sum_df)
通过字典映射效率很高,新测有效!喜欢点赞哦