我有一个这样的表:
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
任何想法如何解决?我需要做两次转座吗?干杯
答案 0 :(得分:3)
在您的情况下,请为RAG
,melt
和df
分配新值
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