给出以下DataFrame:
import pandas as pd
import numpy as np
d=pd.DataFrame({0:[10,20,30,40],1:[20,45,10,35],2:[34,24,54,22],
'0 to 1':[1,1,1,0],'0 to 2':[1,0,1,1],'1 to 2':[1,1,1,1],
})
d=d[[0,1,2,'0 to 1','0 to 2','1 to 2']]
d
0 1 2 0 to 1 0 to 2 1 to 2
0 10 20 34 1 1 1
1 20 45 24 1 0 1
2 30 10 54 1 1 1
3 40 35 22 0 1 1
我想制作3个新专栏;左边3列中的每一列都有一个符合以下标准:
例如: 第1列第0行的值为20,大于第0列(10)中的对应值。列0和1之间的比较列是'0到1'。在此列中,第0行的值为1.还有另一列将第1列与第2列进行比较,但第2列第0行的值为34,因此,因为它大于20,所以忽略1中的1 1到2'。 所以最终的值是'20(0)'。
以下是所需的结果数据框:
0 1 2 0 to 1 0 to 2 1 to 2 0 Final 1 Final 2 Final
0 10 20 34 1 1 1 10 20 (0) 34 (0,1)
1 20 45 24 1 0 1 20 45 (0,2) 24
2 30 10 54 1 1 1 30 (1) 10 54 (0,1)
3 40 35 22 0 1 1 40 (2) 35 (2) 22
提前致谢!
注意:因为我的真实数据左边会有不同数量的列(即0,1,2,3,4)并进行比较,所以我需要一种能够找到所有条件的方法应用。因此,对于特定值,查找比较列值为1且值高于所比较值的所有情况。
更新
澄清:
'0到1'将第0列与第1列进行比较。如果它们之间存在显着差异,则值为1,否则为0.因此对于'0 Final',如果0大于1且'0为1 '是1,在值之后会有一个(1)表示该行的0明显大于1。
这是我到目前为止所拥有的:
d['0 Final']=d[0].astype(str)
d['1 Final']=d[1].astype(str)
d['2 Final']=d[2].astype(str)
d.loc[((d[0]>d[1])&(d['0 to 1']==1))|((d['0 to 2']==1)&(d[0]>d[2])),'0 Final']=d['0 Final']+' '
d.loc[((d[1]>d[0])&(d['0 to 1']==1))|((d['1 to 2']==1)&(d[1]>d[2])),'1 Final']=d['1 Final']+' '
d.loc[((d[2]>d[0])&(d['0 to 2']==1))|((d['1 to 2']==1)&(d[2]>d[1])),'2 Final']=d['2 Final']+' '
d.loc[(d['0 to 1']==1)&(d[0]>d[1]),'0 Final']=d['0 Final']+'1'
d.loc[(d['0 to 2']==1)&(d[0]>d[2]),'0 Final']=d['0 Final']+'2'
d.loc[(d['0 to 1']==1)&(d[1]>d[0]),'1 Final']=d['1 Final']+'0'
d.loc[(d['1 to 2']==1)&(d[1]>d[2]),'1 Final']=d['1 Final']+'2'
d.loc[(d['0 to 2']==1)&(d[2]>d[0]),'2 Final']=d['2 Final']+'0'
d.loc[(d['1 to 2']==1)&(d[2]>d[1]),'2 Final']=d['2 Final']+'1'
d.loc[d['0 Final'].str.contains(' '),'0 Final']=d[0].astype(str)+' ('+d['0 Final'].str.split(' ').str[1]+')'
d.loc[d['1 Final'].str.contains(' '),'1 Final']=d[1].astype(str)+' ('+d['1 Final'].str.split(' ').str[1]+')'
d.loc[d['2 Final'].str.contains(' '),'2 Final']=d[2].astype(str)+' ('+d['2 Final'].str.split(' ').str[1]+')'
0 1 2 0 to 1 0 to 2 1 to 2 0 Final 1 Final 2 Final
0 10 20 34 1 1 1 10 20 (0) 34 (01)
1 20 45 24 1 0 1 20 45 (02) 24
2 30 10 54 1 1 1 30 (1) 10 54 (01)
3 40 35 22 0 1 1 40 (2) 35 (2) 22
它有两个缺点:
我无法预测我需要比较多少列,因此前三个.loc线需要以某种方式解释这一点,假设它可以并且这是最好的方法。
如果超过1,我仍然需要弄清楚如何在括号中的每个数字之间加一个逗号和空格。