转置列并将列名用作另一行中的值

时间:2019-05-15 15:04:27

标签: pandas numpy

我有一个这样的表:

BatchNo     | Replication | Bioreactor | Centrifuge | Red | Amber | Green 
------------|-------------|------------|------------|-----|-------|-------
A1-1        | 1           | 1          | 1          | 1   | 0     | 0     
A1-2        | 0           | 0          | 0          | 0   | 0     | 1     
A1-3        | 1           | 0          | 1          | 0   | 1     | 0     

我需要采取的步骤: 制作一个新列Stage,其中包含列-Replication,Bioreactor,Centrifuge等列,并将其值转换为列状态。然后根据“红色”,“琥珀色”或“绿色”字段中某个值的出现填充另一列RAG。

BatchNo | Stage       | Status | RAG 
--------|-------------|--------|------
A1-1    | Replication | 1      | Red 
A1-1    | Bioreactor  | 1      | Red 
A1-1    | Centrifuge  | 1      | Red 

任何想法如何解决?我需要做两次转座吗?干杯

2 个答案:

答案 0 :(得分:3)

在您的情况下,请为RAGmeltdf分配新值

s=df.loc[:,'Red':]
df['RAG']=s.dot(s.columns)
df=df.melt(['BatchNo','RAG'])
df=df.loc[df.value.eq(1)&df.RAG.ne(df.variable)].copy()
df
Out[57]: 
  BatchNo    RAG     variable  value
0    A1-1    Red  Replication      1
2    A1-3  Amber  Replication      1
3    A1-1    Red   Bioreactor      1
6    A1-1    Red   Centrifuge      1
8    A1-3  Amber   Centrifuge      1

答案 1 :(得分:2)

设置index

d = df.set_index('BatchNo')

stack的一部分,用于将类别放入MultiIndex

loc用于过滤等于1

的值
cats = np.array(['Replication', 'Bioreactor', 'Centrifuge'])
cat = d[cats].rename_axis('Stage', 1).stack().loc[lambda x: x == 1].to_frame('Status')

这些被假定为“一次性”

因此,我可以使用idxmax

rag = d[np.array(['Red', 'Amber', 'Green'])].idxmax(1).rename('RAG')

正确重命名轴和列后...

我应该能够join

cat.join(rag).reset_index()

  BatchNo        Stage  Status    RAG
0    A1-1  Replication       1    Red
1    A1-1   Bioreactor       1    Red
2    A1-1   Centrifuge       1    Red
3    A1-3  Replication       1  Amber
4    A1-3   Centrifuge       1  Amber