np.where用字符串创建缺失值

时间:2018-08-16 11:17:08

标签: python pandas numpy where

我正在创建一个新变量,我的目标是在条件不成立的情况下在“ my_var”中获取缺失值,而是在“ my_var”中创建值“ NaN”,如“ df”所示。 my_var.isnull()。any()”,返回False

import pandas as pd
import numpy as np

data = {'name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 
    'age': [42, 52, 36, 24, 73], 
    'preTestScore': [4, 24, 31, 2, 3],
    'postTestScore': [25, 94, 57, 62, 70]}
df = pd.DataFrame(data, columns = ['name', 'age', 'preTestScore', 'postTestScore'])

df['my_var'] = np.where((df['age']>=36) & (df['age']<=42), 'yes',np.where((df['age']>=52) & (df['age']<=73),'no',np.NaN))

df.my_var.isnull().any()

预期输出为:

data2 = {'my_var': ['yes', 'no', 'yes', np.NaN, 'no']}

df2 = pd.DataFrame(data2, columns = ['my_var'])
df2

2 个答案:

答案 0 :(得分:3)

您可以使用numpy.select而不是嵌套的numpy.where

conditions = [df['age'].between(36, 42), df['age'].between(52, 73)]
values = ['yes', 'no']

df['my_var'] = np.select(conditions, values, None)

print(df)

    name  age  preTestScore  postTestScore my_var
0  Jason   42             4             25    yes
1  Molly   52            24             94     no
2   Tina   36            31             57    yes
3   Jake   24             2             62   None
4    Amy   73             3             70     no

目前尚不清楚您的最终要求是什么

print(df['my_var'].isnull().any())

True

如果要检查布尔值True而不是“ Truthy”值,我强烈建议您使用True / False而不是"yes" / {{1} }。

答案 1 :(得分:2)

由于您的my_var列不是数字,只需将np.nan替换为None

df['my_var'] = np.where((df['age']>=36) & (df['age']<=42), 'yes',
              np.where((df['age']>=52) & (df['age']<=73),'no',None))

df.my_var.isnull().any()

输出:

True