2016-05-25 4 views
9

У меня есть кадр панды данных, sample, с одним из столбцов называются PR, к которой подает функцию лямбды следующим образом:Как правильно применять функцию лямбды в столбец панды кадра данных

sample['PR'] = sample['PR'].apply(lambda x: NaN if x < 90) 

I затем получите следующее сообщение об ошибке синтаксиса:

sample['PR'] = sample['PR'].apply(lambda x: NaN if x < 90) 
                 ^
SyntaxError: invalid syntax 

Что я делаю неправильно?

+0

Может попробовать изменения '' NaN' к np.nan' – jezrael

+2

Вам не нужны фантастическая функция. Просто назначьте его: 'sample.PR [sample.PR <90] = np.nan' – ssm

ответ

9

Вам нужно mask:

sample['PR'] = sample['PR'].mask(sample['PR'] < 90, np.nan) 

Другое решение с loc и boolean indexing:

sample.loc[sample['PR'] < 90, 'PR'] = np.nan 

Пример:

import pandas as pd 
import numpy as np 

sample = pd.DataFrame({'PR':[10,100,40] }) 
print (sample) 
    PR 
0 10 
1 100 
2 40 

sample['PR'] = sample['PR'].mask(sample['PR'] < 90, np.nan) 
print (sample) 
     PR 
0 NaN 
1 100.0 
2 NaN 
sample.loc[sample['PR'] < 90, 'PR'] = np.nan 
print (sample) 
     PR 
0 NaN 
1 100.0 
2 NaN 

EDIT:

Решение с apply:

sample['PR'] = sample['PR'].apply(lambda x: np.nan if x < 90 else x) 

Timingslen(df)=300k:

sample = pd.concat([sample]*100000).reset_index(drop=True) 

In [853]: %timeit sample['PR'].apply(lambda x: np.nan if x < 90 else x) 
10 loops, best of 3: 102 ms per loop 

In [854]: %timeit sample['PR'].mask(sample['PR'] < 90, np.nan) 
The slowest run took 4.28 times longer than the fastest. This could mean that an intermediate result is being cached. 
100 loops, best of 3: 3.71 ms per loop 
+0

Кажется, что я не делаю то, что мне нужно. Идея состоит в том, чтобы заполнить все значения менее 90 в столбце «PR» с помощью NaN. – Amani

+0

Это работает, спасибо вам большое. – Amani

+0

Решение применяется также, примет решение. Благодарю. – Amani

Смежные вопросы