熊猫分配价值多个条件

时间:2017-07-23 06:19:40

标签: python pandas criteria

给出以下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. 包括原始值。
  2. 如果原始值大于要比较的值,并且比较列中有1(带有'to'的列),请列出以逗号分隔的其他列。
  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
    

    它有两个缺点:

    1. 我无法预测我需要比较多少列,因此前三个.loc线需要以某种方式解释这一点,假设它可以并且这是最好的方法。

    2. 如果超过1,我仍然需要弄清楚如何在括号中的每个数字之间加一个逗号和空格。

0 个答案:

没有答案