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

3

我有如下数据框,其中列 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,它由min('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列的数据类型从category变为object类型。

有没有正确的方法来解决这个问题?如果使用apply()函数,我不想再次将列重新设置为分类类型。通常情况下,我将使用以下公式创建许多指示器列:

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

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

然而,它没有利用panda对分类变量的本地排序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接