Добавить столбец на основе нескольких условий - PullRequest
0 голосов
/ 27 февраля 2019

У меня глупая проблема.Мой df выглядит следующим образом:

       FID_2     STA_SID           s2            s1  Qh_STA  Qh_FID2  \
14 222143.00 26040713.00           0.00        0.00    8.00    17.00   
15 222143.00 26040713.00           0.00        8.00    6.00    17.00   
13 222143.00 26040713.00           6.00        8.00    3.00    17.00   
17       NaN 26033594.00 29445425.00        1707.00    5.00      nan   

Я определил следующую функцию и команду:

A = 0.8

def seekDO(row):
       if (row['Qh_STA'])/row['Qh_FID2'] < A :
          return 1
       if ((row['Qh_STA'] + row['s1'])/row['Qh_FID2'] < A) :
          return 1
       if ((row['Qh_STA'] + row['s1'] + row['s2']) / row['Qh_FID2'] < A) :
          return 1
       return 0

df['DO'] = df.apply (lambda row: seekDO(row),axis=1)

Проблема в том, что для DO я получаю

    DO   
14  1  
15  1  
13  1  
17  0 

Вместо

    DO   
14  1  
15  0  
13  0  
17  0 

Можете ли вы увидеть, где я ошибся?

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Но вы должны получить

    DO   
    14  1  
    15  1  
    13  1  
    17  0

. Действительно.

Снова взгляните на свои значения.

    8 / 17 IS < 0.8
    6 / 17 IS < 0.8
    3 / 17 IS < 0.8

Вывод правильный, что вы ожидаетеполучить как вывод не.

0 голосов
/ 27 февраля 2019

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

A = 0.8

m1 = df['Qh_STA']/df['Qh_FID2'] < A 
m2 = (df['Qh_STA'] + df['s1'])/df['Qh_FID2'] < A
m3 = (df['Qh_STA'] + df['s1'] + df['s2']) / df['Qh_FID2'] < A

Затем нужны цепные столбцы с AND на & для соответствия, если все условия True:

df['DO'] = (m1 & m2 & m3).astype(int)
print (df)
       FID_2     STA_SID          s2      s1  Qh_STA  Qh_FID2  DO
14  222143.0  26040713.0         0.0     0.0     8.0     17.0   1
15  222143.0  26040713.0         0.0     8.0     6.0     17.0   0
13  222143.0  26040713.0         6.0     8.0     3.0     17.0   0
17       NaN  26033594.0  29445425.0  1707.0     5.0      NaN   0
0 голосов
/ 27 февраля 2019

Может быть np.where;

condition = ((df['Qh_STA'])/df['Qh_FID2'] < A) | (((df['Qh_STA'] + (df['s1'])/df['Qh_FID2']) < A)) | (((df['Qh_STA'] + df['s1'] + (df['s2']) / df['Qh_FID2']) < A))

df['DO'] = np.where(condition, 1, 0)
...