我有如下数据框,其中列 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()