Сравнить массив по нескольким условиям на уровне столбца в python? - PullRequest
0 голосов
/ 05 мая 2020
df1:
  stu_Id  sub1  sub2  sub3
0  1001    45    68    69
1  1002    67    78    57
2  1003    76    68    78
3  1004    87    56    69
4  1005    45    43    73

df2 :
  stu_Id  sub1  sub2  sub3
0  1001    45    68    69
1  1002    45    68    69
2  1003    45    68    69
3  1004    45    68    69
4  1005    45    68    69


cond1= df1.to_numpy[:,[1]]>df2.to_numpy[:,[1]] then 1 else 0

cond2= df1.to_numpy[:,[2]]<df2.to_numpy[:,[2]] then 1 else 0

cond3= df1.to_numpy[:,[3]]-df2.to_numpy[:,[3]]>5 then 1 else 0

Как сразу применить три вышеуказанных условия массива в df1 на уровне столбца (sub1, sub2, sub3). Я пробовал

df1['sub1','sub2','sub3']=
np.select[[cond1,cond2,cond3],. 
[1,2,3],0]

, это дает мне ошибку.

Вывод:

stu_Id    sub1  sub2  sub3
0  1001    0     0     0
1  1002    1     0     0
2  1003    1     0     1
3  1004    1     1     0
4  1005    0     1     0

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Вы можете сделать это, используя np.where:

In [1925]: import numpy as np

In [1926]: sub1 = np.where(df1.iloc[:,1] > df2.iloc[:,1], 1, 0)                                                                                                                                             

In [1927]: sub2 = np.where(df1.iloc[:,2] < df2.iloc[:,2], 1, 0)                                                                                                                                             

In [1928]: sub3 = np.where((df1.iloc[:,3] - df2.iloc[:,3]) > 5, 1, 0)  

In [1932]: pd.DataFrame({'stud_Id':df2.stu_Id.tolist(), 'sub1': sub1, 'sub2': sub2, 'sub3': sub3})                                                                                                          
Out[1932]: 
   stud_Id  sub1  sub2  sub3
0     1001     0     0     0
1     1002     1     0     0
2     1003     1     0     1
3     1004     1     1     0
4     1005     0     1     0
0 голосов
/ 06 мая 2020

установить stu_Id в качестве индекса и вычесть df2 из df1

m = df1.set_index('stu_Id').sub(df2.set_index('stu_Id'))
m


       sub1 sub2    sub3
stu_Id          
1001    0      0    0
1002    22    10    -12
1003    31    0     9
1004    42  -12     0
1005    0   -25     4

создать функции на основе условий и сопоставить их с соответствующими столбцами

def sub1(x):
    if x > 0 :
        return 1
    else:
        return 0

def sub2(x):
    if x < 0 : 
        return 1
    else:
        return 0

def sub3(x):
    if x > 5:
        return 1
    else :
        return 0

m.sub1 = m.sub1.map(sub1)
m.sub2 = m.sub2.map(sub2)
m.sub3 = m.sub3.map(sub3)

m

      sub1  sub2    sub3
stu_Id          
1001    0    0       0
1002    1    0       0
1003    1    0       1
1004    1    1       0
1005    0    1       0

, вы также можете использовать numpy, где , чтобы реплицировать ту же функцию для каждого столбца, что должно быть намного быстрее.

...