Pandas:分类列上的min()问题

时间:2015-10-15 08:43:00

标签: pandas

我有以下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)`

我想创建一个由min定义的新列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)

但是,这不起作用,因为apply()使A / B / C列成为类型对象,因此min()按字典顺序对值进行排序,而不是我提供的排序。

我也尝试过:

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

tranpose()也导致A / B / C列变为类型对象而不是类别。

有关如何正确执行此操作的任何想法?如果使用apply(),我宁愿不再将列重新分类为第二次。一般来说,我将使用以下公式创建一堆指标列:

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

1 个答案:

答案 0 :(得分: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

然而,它没有使用熊猫对分类变量的本地排序。