Python 在数字列的新列中捕获NAs的存在
我有一个数据集,我想运行决策树建模。但是,数据集在数字列和分类列中都有NAs 对于分类列,我的解决方案很简单,我在整个分类列列表中使用了dummy_na=True的伪编码。我所有的专栏都有猫咪的名字,所以很容易捕捉Python 在数字列的新列中捕获NAs的存在,python,pandas,Python,Pandas,我有一个数据集,我想运行决策树建模。但是,数据集在数字列和分类列中都有NAs 对于分类列,我的解决方案很简单,我在整个分类列列表中使用了dummy_na=True的伪编码。我所有的专栏都有猫咪的名字,所以很容易捕捉 #get list of cat columns cat_cols = [col for col in df5.columns if '_CAT' in col] #dummy encode and capture NA presence df_new = pd.get_dummie
#get list of cat columns
cat_cols = [col for col in df5.columns if '_CAT' in col]
#dummy encode and capture NA presence
df_new = pd.get_dummies(df_old,dummy_na=True, columns = cat_cols )
问题在于数字列:我无法将平均值/中位数填入NAs,因为缺少数据背后有其意义。我无法计算0,因为它是列的有效值。我可以输入一些像-9999999这样的时髦数据,因为它是一个如此大的异常值,它可能会将NAs与其他数字数据区分开来
但我想知道是否有某种方法可以轻松地为每个数字列创建一个列,该列将有一个二进制1或0指示符,以显示该数字列的行中是否有NA
如果我有这个:
ID Value1_X Class Value2_X
0 1 33 Y 0.01
1 2 101 N 0.05
2 3 25 N NaN
3 4 245 N NaN
4 5 NaN N 0.61
5 6 30000 Y 2.3
它变成这样:
ID Value1_X Value1_NA Class Value2_X Value2_NA
0 1 33 0 Y 0.01 0
1 2 101 0 N 0.05 0
2 3 25 0 N NaN 1
3 4 245 0 N NaN 1
4 5 NaN 1 N 0.61 0
5 6 30000 0 Y 2.3 0
此外,我所有的数字列的名称中都有_NUM。是否有一种方法可以为名称中包含_NUM的所有列自动创建NA指示符列,就像我对分类列所做的那样?NA指示符列名是否与上面示例中的数字列名相匹配
要重新创建上述示例的数据:
data2 = [['1', 33,'Y',0.01], ['2', 101,'N',0.05],
['3', 25,'N',np.nan],['4', 245,'N',np.nan],
['5',np.nan ,'N',0.61], ['6', 30000,'Y',2.3]]
df2 = pd.DataFrame(data2, columns = ['ID', 'Value1_X','Class','Value2_X'])
data3 = [['1', 33,0,'Y',0.01,0],
['2', 101,0,'N',0.05,0],
['3', 25,0,'N','NaN',1],
['4', 245,0,'N','NaN',1],
['5','NaN',1 ,'N',0.61,0],
['6', 30000,0,'Y',2.3,0]]
df3 = pd.DataFrame(data3, columns = ['ID', 'Value1_X','Value1_NA','Class','Value2_X','Value2_NA'])
进口
import numpy as np
import pandas as pd
import math
检验函数
def func(x):
if(math.isnan(x)):
return 0;
else:
return 1;
函数调用
df2["value_1X_B"]=df2["Value1_X"].apply(func)
输出
ID Value1_X Class Value2_X value_1X_B
0 1 33.0 Y 0.01 1
1 2 101.0 N 0.05 1
2 3 25.0 N NaN 1
3 4 245.0 N NaN 1
4 5 NaN N 0.61 0
您可以尝试以下方法:
data2 = [['1', 33,'Y',0.01], ['2', 101,'N',0.05],
['3', 25,'N',np.nan],['4', 245,'N',np.nan],
['5',np.nan ,'N',0.61], ['6', 30000,'Y',2.3]]
df2 = pd.DataFrame(data2, columns = ['ID', 'Value1_X','Class','Value2_X'])
df2.assign(**df2.select_dtypes(include='number')
.isna()
.astype(int)
.rename(columns=lambda x: x.split('_')[0]+'_NA'))
输出:
ID Value1_X Class Value2_X Value1_NA Value2_NA
0 1 33.0 Y 0.01 0 0
1 2 101.0 N 0.05 0 0
2 3 25.0 N NaN 0 1
3 4 245.0 N NaN 0 1
4 5 NaN N 0.61 1 0
5 6 30000.0 Y 2.30 0 0
注意:我修改了您的输入数据框,使“NaN”实际上是np.NaN,以获得要浮动的列的数据类型,而不是字符串/对象数据类型。刚刚删除了指定列中带有NAs的行,这不是我试图实现的。编辑工作会检查它吗?是的,确实如此!谢谢是否仍然可以使函数调用在dataframe中的列列表上循环,以获得每个数值变量的NA指示符列?我在原始数据集中有将近100个数字列,它们的名称末尾都以X结尾。我将名称列表存储在如下对象中:Num_cols=[col for col in df6.columns if'\u X'in col]您可以创建一个字典:
dictionary={“Value1_X”:“Value_1X_B”,“Value2_X”:“Value2_X_B”}
然后对于键,dictionary.items()中的值:df2[values]=df2[keys]。apply(func)
现在添加a\u B的逻辑是基本的,您可以使用loopIt将df2.columns添加到其中!谢谢:)
ID Value1_X Class Value2_X Value1_NA Value2_NA
0 1 33.0 Y 0.01 0 0
1 2 101.0 N 0.05 0 0
2 3 25.0 N NaN 0 1
3 4 245.0 N NaN 0 1
4 5 NaN N 0.61 1 0
5 6 30000.0 Y 2.30 0 0