为了账号安全,请及时绑定邮箱和手机立即绑定

对于每一行返回最小值的列名 - pandas

对于每一行返回最小值的列名 - pandas

呼如林 2023-06-27 10:36:41
假设我有一个具有以下值的数据框:id    product1sold   product2sold   product3sold1     2              3              32     0              0              53     3              2              1如何在每个 ID 的列表中添加包含所有最畅销和最不畅销产品的“most_sold”和“least_sold”列?它应该看起来像这样。id    product1   product2   product3    most_sold                least_sold1        2          3          3        [product2, product3]      [product1]     2        0          0          5        [product3]                [product1, product2]3        3          2          1        [product1]                [product3]
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

使用列表理解来测试产品列表的最小值和最大值:


#select all columns without first

df1 = df.iloc[:, 1:]

cols = df1.columns.to_numpy()


df['most_sold'] = [cols[x].tolist() for x in df1.eq(df1.max(axis=1), axis=0).to_numpy()]

df['least_sold'] = [cols[x].tolist() for x in df1.eq(df1.min(axis=1), axis=0).to_numpy()]

print (df)

   id  product1sold  product2sold  product3sold                     most_sold  \

0   1             2             3             3  [product2sold, product3sold]   

1   2             0             0             5                [product3sold]   

2   3             3             2             1                [product1sold]   


                     least_sold  

0                [product1sold]  

1  [product1sold, product2sold]  

2                [product3sold]  

如果性能不重要,可以使用DataFrame.apply

df1 = df.iloc[:, 1:]


f = lambda x: x.index[x].tolist()

df['most_sold'] = df1.eq(df1.max(axis=1), axis=0).apply(f, axis=1)

df['least_sold'] = df1.eq(df1.min(axis=1), axis=0).apply(f, axis=1)


查看完整回答
反对 回复 2023-06-27
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

你可以做这样的事情。

minValueCol = yourDataFrame.idxmin(axis=1) maxValueCol =  yourDataFrame.idxmax(axis=1)


查看完整回答
反对 回复 2023-06-27
  • 2 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信