2015-10-15 65 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 

但它没有利用熊猫的分类变量本地排序。