2015-10-15 97 views
3

我有以下DF,其中,列A,B,C是具有嚴格的排序分類變量:熊貓:問題與範疇列分鐘()

df = DataFrame([[0, 1, 'PASS', 'PASS', 'PASS'], 
       [0, 2, 'CHAIN', 'FAIL', 'PASS'], 
       [0, 3, 'PASS', 'PASS', 'TATPG'], 
       [0, 4, 'FAIL', 'PASS', 'FAIL'], 
       [0, 5, 'FAIL', 'ATPG', 'FAIL']], 
       columns = ['X', 'Y', 'A', 'B', 'C']) 
for c in ['A','B','C']: 
    df[c] = df[c].astype('category', categories=['CHAIN', 'ATPG', 'TATPG', 'PASS', 'FAIL'], ordered=True)` 

我想創建其定義一個新列d由分('A','B','C')。例如,第1行說'CHAIN'。這是最小的價值。因此,D [1] = CHAIN等。的d列應導致如下:

D[0] = PASS, D[1] = CHAIN, D[2] = TPATG, D[3] = PASS, D[4] = ATPG 

我嘗試:

df['D'] = df[['A','B','C']].apply(min, axis=1) 

但是,這是行不通的應用()使得A/B/C柱成爲類型的對象,因此分鐘的()按照字典順序排序值,而不是我提供的順序。

我也嘗試:

df['D'] = df[['A', 'B', 'C']].transpose().min(axis=0) 

TRANSPOSE(移調)()也列中的A/B/C的結果得到改變輸入對象,而不是類別。

有關如何正確執行此操作的任何想法?如果使用apply(),我寧願不將列重新排列爲第二次分類。

df[indicator] = df[[any subset of (A,B,C)]].min() 

回答

0

我發現,用鑰匙適用sorted的解決方案:

d = {'CHAIN': 0, 
    'ATPG': 1, 
    'TATPG': 2, 
    'PASS': 3, 
    'FAIL':4} 

def func(row): 
    return sorted(row, key=lambda x:d[x])[0] 

df['D'] = df[['A','B','C']].apply(func, axis=1) 

它給你,你的結果一般情況下,我會用這個公式來創建一堆指標列尋找:

0  PASS 
1 CHAIN 
2 TATPG 
3  PASS 
4  ATPG 

但它沒有利用熊貓的分類變量本地排序。