数据分析(二)

本文探讨了数据清洗过程中的缺失值和重复值处理。在缺失值处理中,介绍了dropna()和fillna()函数的使用,包括不同参数的含义和应用。在特征处理方面,提到了年龄的分箱处理、文本变量的转换以及从Name特征中提取Titles信息的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

数据清洗及特征处理

缺失值观察与处理

任务一:缺失值观察

任务二:对缺失值进行处理

重复值观察与处理

任务一:请查看数据中的重复值

 特征观察与处理

任务一:对年龄进行分箱(离散化)处理

 任务二:对文本变量进行转换

任务三(附加):从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等) 


数据清洗及特征处理

缺失值观察与处理

任务一:缺失值观察

(1) 请查看每个特征缺失值个数

''' 方法一 '''
df.info()

''' 方法二 '''
df.isnull().sum()
df.isna().sum()


(2) 请查看Age, Cabin, Embarked列的数据

''' 方法一 '''
df[['Age','Cabin','Embarked']].head(3)

''' 方法二 '''
df.loc[:2,['Age','Cabin','Embarked']]

''' 方法三 '''
pd.DataFrame(df,columns=['Age','Cabin','Embarked']).head(3)

查询某一列缺失值: 

df = pd.read_csv('train.csv')
df[np.isnan(df['Age'])]

'''易错点
np.nan != np.nan(实际np.nan不等于任何值)
故不能用df[df['Age'] == np.nan] 做判断来判断某列是否有空值!'''

任务二:对缺失值进行处理

dropna()函数

dropna(axis,how,thresh,subset,inplace)

axis:这个参数默认为0,当等于0时代表的是删除空值nan所在的行,当等于1时删除空值所在的列。

how:这个参数的值默认为‘any’,表示的是删除空值所在的行或者是列,这个主要看前面的axis参数你设定是0还是1;当参数等于‘all’,表示的是删除一阵行或者是一整列都为空值nan的行或者列,如果你的某一行或某一列,不全为空值的话,则不会删除,即不起作用。

thresh:这个参数是一个整数x,意思是保留空值nan的数量小于x的每一行或者是每一列。比如我设置x=2,那么我每一行或者是每一列的非空值的数量大于等于2的行或者列都会被保存,具体是行还是列,那还是看前面的axis参数的设置。

subset:这个参数的意思是指定删除特定行或列的空值所在的列或行,如果axis=0,表示如果指定行x中有空值,则删除所在的列;如果axis=1,表示如果指定列x有空值,则删除空值所在的行。

inplace:这个参数默认为False,它的意思是你在处理空值nan时,是在原数据上处理还是在先把原数据复制一份,然后在副本上处理,在副本上处理的时候,原数据不受任何影响;如果inplace设置为True,那代表你在原数据上进行处理,原数据直接受影响。
 

df = pd.read_csv('train.csv')
df.dropna(inplace=True)
df

 fillna()函数

fillna(axis,mthod,limit,inplace)

axis:这个参数取1时,表示按照行来填充,取0时表示按照列来填充。默认为0,即按照列。和dropna函数的刚好相反。

method:这个参数的意思是填充的方式,如果为‘ffill’,则是将这个空值的前一个数据复制给这个空值;如果为‘bfill’,则是将这个空值的后一个数据复制给这个空值。如果不用这个参数,不声明即可。

limit:这个参数时限制填充的空值的个数,比如某一列有两个空值,我这里指定只填充一个空值,另一个空值不管它。
 

df = pd.read_csv('train.csv')
df.fillna(0,inplace=True)
df

Python处理数据中的空值(缺失值)时用到的dropna()函数和fillna()函数总结,通过示例弄懂这两个函数的用法。_AI学习的我的博客-优快云博客_python数据空值处理

重复值观察与处理

任务一:请查看数据中的重复值

df.duplicated

DataFrame.duplicated(subset=None, keep='first')
功能:返回一个布尔类型的Series来标注重复的行。
参数一:列名或列名的list,来标记特定考虑的列。
参数二:有{‘first’, ‘last’, False}选项,first:把重复项的第一个数据标记为False,其余为True;last,把重复项中最后一个数据标记为False,其余为True;False:把全部数据都标记为True。

'''清除重复值并保存'''
df = df.drop_duplicates()
df.head()

df.to_csv('test_clear.csv')

 特征观察与处理

任务一:对年龄进行分箱(离散化)处理

#将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
df = pd.read_csv('train.csv')
df['AgeBand'] = pd.cut(df['Age'], 5,labels = [1,2,3,4,5])
df.head()

#将连续变量Age划分为(0,5] (5,15] (15,30] (30,50] (50,80]五个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = [1,2,3,4,5])
df.head(3)

#将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
df['AgeBand'] = pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
df.head()

 任务二:对文本变量进行转换

1. 

#查看类别文本变量名及种类

#方法一: value_counts
df['Sex'].value_counts()
-------------------------------------------------------------------------------------------
male      453
female    261
0           1
Name: Sex, dtype: int64


#方法二: unique
df['Sex'].unique()
-------------------------------------------------------------------------------------------array(['male', 'female', 0], dtype=object)


df['Sex'].nunique()#输出种类数
-------------------------------------------------------------------------------------------
2

2. 

#将类别文本转换为12345

#方法一: replace
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
df.head()


#方法二: map 字典形式存储
df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2})
df.head()


#方法三: 使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
    lbl = LabelEncoder()
    print(f"feat is {feat}") 
    print("end")
    #下回不懂的地方以这种输出进行观察
    label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
    #给Cabin和Ticket以range打标签,有几种打几种
    print(f"label_dict is {label_dict}")
    print("end label_dict")
    df[feat + "_labelEncode"] = df[feat].map(label_dict)
    #打好的标签以_+labelEncode方式命名存储。
    df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))

df.head()

 little tip:zip是森莫?

a = [1,2,3]
b = [4,5,6]
for i in zip(a,b):
    print(i)
-------------------------------------------------------------------------------------------
(1, 4)
(2, 5)
(3, 6)

3.

#将类别文本转换为one-hot编码

#方法一: OneHotEncoder
for feat in ["Age", "Embarked"]:
#     x = pd.get_dummies(df["Age"] // 6)
#     x = pd.get_dummies(pd.cut(df['Age'],5))
    x = pd.get_dummies(df[feat], prefix=feat)
    df = pd.concat([df, x], axis=1)
    #df[feat] = pd.get_dummies(df[feat], prefix=feat)
df.head()

 little tip:onehot编码

 类似于:0000  0010   0100

任务三(附加):从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等) 

df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
#([A-Za-z]+)\.为正则表达式,以 “.” 为终结,正好定位到 “Mr.” 或 “Miss.”
df.head()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值