我有以下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()
答案 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
然而,它没有使用熊猫对分类变量的本地排序。