python - 对于每一行,返回最小值的列名 - pandas
问题描述
假设我有一个具有以下值的数据框:
id product1sold product2sold product3sold
1 2 3 3
2 0 0 5
3 3 2 1
如何在每个 ID 的列表中添加包含所有最畅销和最少售出产品的“最畅销”和“最不畅销”列?它应该看起来像这样。
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]
解决方案
使用列表推导和测试产品列表的最小值和最大值:
#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)
推荐阅读
- javascript - 从 2 个数组中总结用户购物车的价格
- python - 在 Tensorflow 中过滤张量元素
- macos - Gzipping 删除了 MacOS 中由 codesign 签名的文件签名
- flutter - 由于某种原因不能使用flutter_bloc
- python - 如何将分钟和小时的刻度添加到对数秒的 y 轴?
- c++ - Windows C++ API:如何将整个二进制文件读入缓冲区?
- ncurses - wgetch 未检测到 KEY_UP 等
- sql - 比较 3 个 SQL Server 表,一旦根据某个属性匹配,则将结果放在一个表中,当不匹配时将结果放在另一个表中
- javascript - 为什么迭代 Set 的值会分配和创建垃圾?
- windows - 使用 Windows 终端的 Cmder 错误颜色