选择csv文件中的特定单元格,并在python中返回pandas中的列和行详细信息

时间:2017-09-12 12:34:25

标签: python pandas dataframe

我有一个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。行标题和列标题为saladfat。对于row 2,最低的数字是0.1。行标题和列标题为Breadoil以及breadsalt

我很想知道在熊猫中是否有一种简单的方法。

2 个答案:

答案 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