Как проверить условие на уровне строки с помощью np.where - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть следующий фрейм данных в пандах:

 code     diff     pv      
 0        -34      100
 1         34      100
 2         16      100
 3         -50     150

Мой желаемый фрейм данных будет:

 code     diff     pv      flag    
 0        -344     100     excess 
 1         344     100     short 
 2         2       100     pass  
 3         -5      150     pass
 4        -200     150     excess
 5         200     150     short

логика для flag столбца

 short = diff is positive > pv
 excess = diff is negative < -pv (pv is taken to be negative) 
 pass = if the diff is within range of +- PV 

Какя могу достичь этого в пандах?

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Вы можете работать с соотношением df['diff'] / df['pv'] и использовать отображение словаря:

ratio = df['diff'].div(df['pv']).clip(-1, 1)
# or ratio = np.minimum(1, np.maximum(-1, df['diff'] / df['pv']))

d = {-1: 'excess', 1: 'short'}

df['flag'] = ratio.map(d).fillna('pass')

print(df)

   code  diff   pv    flag
0     0  -344  100  excess
1     1   344  100   short
2     2     2  100    pass
3     3    -5  150    pass
4     4  -200  150  excess
5     5   200  150   short
0 голосов
/ 24 сентября 2018

Вот как я бы это сделал

def func(row):
    diff, pv = row['diff'], row['pv']
    if diff > 0 and diff > pv: 
        return 'short'
    elif diff < 0 and diff < -pv:
        return 'excess'
    elif -pv <= diff <= pv:
        return 'pass'

df['flag'] = df.apply(func, axis=1)

Я применяю func к каждой строке df.

code  diff   pv    flag                                                                                                                                                                                                                
0     -344  100  excess                                                                         
1      344  100   short                                                                                                 
2        2  100    pass                                                                                               
3       -5  150    pass                                                                                                   
4     -200  150  excess                                                                                                    
5      200  150   short
0 голосов
/ 24 сентября 2018

Здесь лучше всего использовать numpy.select:

m1 = df['diff'] > df['pv']
m2 = df['diff'] < -df['pv']

#if need check negative and positive diff
m1 = (df['diff'] > df['pv']) & (df['diff'] > 0)
m2 = (df['diff'] < -df['pv']) & (df['diff'] < 0)

df['flag'] = np.select([m1, m2], ['short','excess'], 'pass')

#solution with double np.where
df['flag'] = np.where(m1, 'short',
             np.where(m2, 'excess', 'pass'))

print (df)
   code  diff   pv    flag
0     0  -344  100  excess
1     1   344  100   short
2     2     2  100    pass
3     3    -5  150    pass
4     4  -200  150  excess
5     5   200  150   short
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...