gpt4 book ai didi

python - 根据 Pandas 中的条件返回列名列表作为新列

转载 作者:太空宇宙 更新时间:2023-11-04 01:45:33 25 4
gpt4 key购买 nike

我的每个客户和产品的数据如下所示:

Customer  P1   P2   P3   P4   P5   P6 
c1 10 2 43 21 11 4
c2 1 3 32 1 6 3
c3 20 4 20 72 78 80
c4 30 80 31 31 29 20

我想要的输出如下:

Customer  P1   P2   P3   P4   P5   P6   Top_Products (based on scores)
c1 10 2 43 21 11 4 [P3,P4,P5]
c2 1 3 32 1 6 3 [P3,P5,P2]
c3 20 4 20 72 78 80 [P6,P5,P4]
c4 30 80 31 31 29 20 [P2,P3,P4]

输出说明:我正在对每个客户的产品分数进行水平排序,并采用前 3 个分数的列名称(降序)并将列表作为每个客户的“顶级产品”的新列。

例如。对于第 1 行,p3、p4 和 p5 的得分最高(按最佳得分排序),并作为列表放在另一列中

最佳答案

首先使用iloc 获取所有P 列并获取按numpy.argsort 排序的值的位置,使用索引并最后将值转换为列表:

df1 = df.iloc[:, 1:]

df['Top_Products'] = df1.columns.values[np.argsort(df1.to_numpy(), axis=1)[:, :3]].tolist()
print (df)
Customer P1 P2 P3 P4 P5 P6 Top_Products
0 c1 10 2 43 21 11 4 [P2, P6, P1]
1 c2 1 3 32 1 6 3 [P1, P4, P2]
2 c3 20 4 20 72 78 80 [P2, P1, P3]
3 c4 30 80 31 31 29 20 [P6, P5, P1]

如果性能不重要或行数较少,请使用 Series.nsmallest将索引转换为列表:

df['Top_Products'] = df1.apply(lambda x: x.nsmallest(3).index.tolist(), axis=1)
print (df)
Customer P1 P2 P3 P4 P5 P6 Top_Products
0 c1 10 2 43 21 11 4 [P2, P6, P1]
1 c2 1 3 32 1 6 3 [P1, P4, P2]
2 c3 20 4 20 72 78 80 [P2, P1, P3]
3 c4 30 80 31 31 29 20 [P6, P5, P1]

编辑:对于最高分的前 3 个值,答案非常相似,只为 -df1.to_numpy() 添加 -:

df1 = df.iloc[:, 1:]

df['Top_Products'] = df1.columns.values[np.argsort(-df1.to_numpy(), axis=1)[:, :3]].tolist()
print (df)
Customer P1 P2 P3 P4 P5 P6 Top_Products
0 c1 10 2 43 21 11 4 [P3, P4, P5]
1 c2 1 3 32 1 6 3 [P3, P5, P2]
2 c3 20 4 20 72 78 80 [P6, P5, P4]
3 c4 30 80 31 31 29 20 [P2, P3, P4]

关于python - 根据 Pandas 中的条件返回列名列表作为新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59137920/

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