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

假设我有一个具有以下值的数据框:


id    product1sold   product2sold   product3sold

1     2              3              3

2     0              0              5

3     3              2              1

如何在每个 ID 的列表中添加包含所有最畅销和最不畅销产品的“most_sold”和“least_sold”列?它应该看起来像这样。


id    product1   product2   product3    most_sold                least_sold

1        2          3          3        [product2, product3]      [product1]     

2        0          0          5        [product3]                [product1, product2]

3        3          2          1        [product1]                [product3]


呼如林
浏览 262回答 2
2回答

慕运维8079593

使用列表理解来测试产品列表的最小值和最大值:#select all columns without firstdf1 = 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)

神不在的星期二

你可以做这样的事情。minValueCol = yourDataFrame.idxmin(axis=1) maxValueCol =  yourDataFrame.idxmax(axis=1)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python