我有一个pandas数据框,其中包含下面提到的详细信息。
NAMES, Oil, Fat, Salt
Salad, 0.2, 0.1, 0.8
Bread, 0.1, 0.9, 0.1
对于每一行,我想找到最小值值并分别返回其行和列名称。输出应如下所示。
E.g.,
['Salad', 'Fat']
[['Bread', 'Oil'], ['Bread', 'Salt']]
也就是说,如果我们考虑row 1
,则最低数字为0.1
。行标题和列标题为salad
和fat
。对于row 2
,最低的数字是0.1
。行标题和列标题为Bread
和oil
以及bread
和salt
。
我很想知道在熊猫中是否有一种简单的方法。
答案 0 :(得分:1)
您可以使用lambda函数将其应用于每一行:
df.apply(lambda row: [[row.name, l] for l in row[row == row.min()].index], axis=1).tolist()
如果NAMES
不是索引,请使用:
df.set_index('NAMES').apply(lambda row: [[row.name, l] for l in row[row == row.min()].index], axis=1).tolist()
假设您的索引是' Names'。
答案 1 :(得分:0)
IIUC:
In [214]: df = df.set_index('NAMES')
然后:
In [215]: df[df.eq(df.min(1), axis=0)].stack().reset_index().drop(0,1).values.tolist()
Out[215]: [['Salad', 'Fat'], ['Bread', 'Oil'], ['Bread', 'Salt']]
或:
In [222]: df[df.eq(df.min(1), axis=0)].stack().index.tolist()
Out[222]: [('Salad', 'Fat'), ('Bread', 'Oil'), ('Bread', 'Salt')]
说明:
In [216]: df.eq(df.min(1), axis=0)
Out[216]:
Oil Fat Salt
NAMES
Salad False True False
Bread True False True
In [217]: df[df.eq(df.min(1), axis=0)].stack().reset_index()
Out[217]:
NAMES level_1 0
0 Salad Fat 0.1
1 Bread Oil 0.1
2 Bread Salt 0.1
In [218]: df[df.eq(df.min(1), axis=0)].stack().reset_index().drop(0,1)
Out[218]:
NAMES level_1
0 Salad Fat
1 Bread Oil
2 Bread Salt