2017-09-21 7 views
1

パンダのデータフレームの各行について、最小値を持つセル/セルを見つけて、その行と列の名前を別々に返したいと思います。また、その最小値が1未満かどうかを確認したいと思います。Pythonのパンダの列と行の名前を取得する

例えば、上記データフレームの

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() 

は私を助けてください。

答えて

0

私はあなたが新しい条件を追加する必要があると思う:

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']]] 
+0

感謝を削除する必要がある場合しかし、私は任意の空のリストを返す必要はありません。私はそれがこのようなものになりたい。 「サラダ」、「ファット」]、[パン '、'オイル ']、[パン'、 'ソルト']]]。どうすればいいのか教えてください:) –

+1

うーん、[this](https://stackoverflow.com/q/4842956/2901002)の解決策が見つかりました。 – jezrael

+0

偉大な:)ありがとうたくさん! –

3

使用

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']]] 
+0

素晴らしい!どうもありがとう :) –

関連する問題