Замена значений вне указанных в столбцах диапазонов c нескольких столбцов в фрейме данных pandas - PullRequest
1 голос
/ 24 апреля 2020

Я новичок в pandas и хочу очистить фрейм данных с множеством столбцов.

Я хочу сохранить значения, попадающие в диапазон, указанный c для каждого столбца, например, для столбца с именем «Возраст», я хочу сохранить значения больше 5 и меньше 25. Если значение выходит за пределы из этого диапазона я хочу заменить его на NaN, например, в столбце «Возраст» есть значение 918, которое я хочу заменить.

В своей попытке я использую словарь, потому что, как я уже сказал, у меня много столбцов. Этот код не работает, потому что на самом деле он не изменяет ни одно из значений в моем исходном фрейме данных (без сообщения об ошибке).

Спасибо за любую помощь!

# PACKAGES 
import pandas as pd
import numpy as np 


# STARTING DATA 
data = [[1.0, 10, 0], [0.0, 12, 0.4], [2.0, 918, 0.9]]   
df = pd.DataFrame(data, columns = ['TriGly', 'Age', 'Chol']) 

dict = {
    'Age': (5, 25),
    'Chol': (0.2, 1.2),
    'TriGly': (0.0, 1.0)
}


# CLEAN 
for column_name in df.columns:                                             
    if column_name in dict:                                                
        for row in df[column_name]:                                        
            if dict[column_name][0] < row < dict[column_name][1]:       
                row = row                                                   
            else:
                row = np.nan                                               

# DESIRED DATA 
data2 = [[1.0, 10, np.nan], [0.0, 12, 0.4], [np.nan, np.nan, 0.9]]   
df2 = pd.DataFrame(data2, columns = ['TriGly', 'Age', 'Chol']) 

1 Ответ

0 голосов
/ 24 апреля 2020

Для каждого столбца вы можете использовать .between(min_val, max_val) для определения допустимых значений. Затем вы можете использовать .where для маскировки других значений как nan. Наконец, выполните быстрое применение к столбцам:

df.apply(lambda x: x.where(x.between(*(my_dict[x.name])) ) )

Вывод:

   TriGly   Age  Chol
0     1.0  10.0   NaN
1     0.0  12.0   0.4
2     NaN   NaN   0.9
...