我有一个如下表:
group shopspend clothspend foodspend music spend
A 1 2 12 34
B 1 2 12 34
C 1 2 12 34
d 1 2 12 34
在我的原始框架中,我有更多的专栏。如何返回(对于每组,按行(每行的前3个最低值和前3个最高值,并返回相应的列值?注:组是一个索引:
df = df.set_index('group')
df.apply(lambda x: df.columns[np.argsort(x)], 1).iloc(axis=0)[:, :3]
上面试过了,但上面写着IndexingError:索引器太多。。不知道如何为每行获取最高和最低的前3列。。
您可以沿着列使用.agg()
(从而将其应用于每一行(,并返回具有适当元素的Series。要找出它们是什么,请使用nlargest
和nsmallest
:
>>> df.agg(lambda s: pd.Series([*s.nlargest(3).index, *s.nsmallest(3).index],
... ['max1', 'max2', 'max3', 'min1', 'min2', 'min3']),
... axis='columns')
max1 max2 max3 min1 min2 min3
group
A musicspend foodspend clothspend shopspend clothspend foodspend
B musicspend foodspend clothspend shopspend clothspend foodspend
C musicspend foodspend clothspend shopspend clothspend foodspend
d musicspend foodspend clothspend shopspend clothspend foodspend
有些列是重复的,但这是因为在您的示例中只有4个:这里,第三小的也是第二大的,依此类推