【问题标题】:Get the column and row names in pandas in python在python中获取pandas中的列名和行名
【发布时间】:2017-09-21 12:41:06
【问题描述】:

对于 pandas 数据框中的每一行,我想找到具有最小值的单元格/单元格,并分别返回其行名和列名。我还想检查该最小值是否小于一。

例如,

NAMES, Oil, Fat, Salt
Salad,  0.2, 0.1,  0.8
Bread,  0.1, 0.9,  0.1
Rice,    1,   1,  1

上述数据框的输出:

['Salad', 'Fat']
[['Bread', 'Oil'], ['Bread', 'Salt']]
<No output because the minimum is not less than 1>

我当前的代码如下所示,

pairs = df.set_index('NAMES').apply(lambda row: [[row.name, l] for l in row[row == row.min()].index], axis=1).values.tolist()

请帮帮我。

【问题讨论】:

    标签: pandas


    【解决方案1】:

    使用

    In [2224]: dff = df.set_index('NAMES')
    
    In [2225]: dff.where(dff<1).eq(dff.min(1), axis=0).apply(
                        lambda x: [[x.name, v] for v in x[x].index], axis=1).values.tolist()
    Out[2225]: [[['Salad', ' Fat']], [['Bread', ' Oil'], ['Bread', ' Salt']], []]
    

    如果您需要删除空列表,请使用过滤器

    In [2230]: vals = dff.where(dff<1).eq(dff.min(1), axis=0).apply(
                 lambda x: [[x.name, v] for v in x[x].index], axis=1).values.tolist()
    
    In [2231]: filter(None, vals)
    Out[2231]: [[['Salad', ' Fat']], [['Bread', ' Oil'], ['Bread', ' Salt']]]
    

    或者,

    In [2235]: vals2 = dff.where(dff<1).eq(dff.min(1), axis=0).apply(
                   lambda x: [[x.name, v] for v in x[x].index], axis=1)
    
    In [2236]: [x for x in vals2 if x]
    Out[2236]: [[['Salad', ' Fat']], [['Bread', ' Oil'], ['Bread', ' Salt']]]
    

    【讨论】:

    • 太棒了!非常感谢:)
    【解决方案2】:

    我认为您需要添加新条件:

    pairs = (df.set_index('NAMES')
              .apply(lambda row: [[row.name, l] for l in row[(row == row.min()) & 
                                                             (row < 1)].index], axis=1)
              .values.tolist())
    print (pairs)
    [[['Salad', 'Fat']], [['Bread', 'Oil'], ['Bread', 'Salt']], []]
    

    然后使用this solutions:

    pairs = [x for x in pairs if x]
    print (pairs)
    [[['Salad', 'Fat']], [['Bread', 'Oil'], ['Bread', 'Salt']]]
    

    #for python 3 add list
    pairs = list(filter(None, pairs))
    print (pairs)
    [[['Salad', 'Fat']], [['Bread', 'Oil'], ['Bread', 'Salt']]]
    

    pairs = [x for x in pairs if x != []]
    print (pairs)
    [[['Salad', 'Fat']], [['Bread', 'Oil'], ['Bread', 'Salt']]]
    

    【讨论】:

    • 非常感谢您的回答:) 但我不需要返回任何空列表。我希望它是这样的。 [[['Salad', 'Fat']], [['Bread', 'Oil'], ['Bread', 'Salt']]]。请告诉我怎么做:)
    • 太好了 :) 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2016-02-05
    • 2018-06-01
    • 2020-04-11
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多