数据分析中的数据处理以及特征分析

主要讲述在数据处理及特征分析中利用到的pandas库中的功能,该文以Datawhale提供的资料以及网络搜集的资源整理而成,如有错误欢迎指正。

目录

 一.查看空缺的数值所在的位置

 二.对缺失值进行处理

1.判断缺失值

2.处理缺失值

三.重复值观察与处理

1.查看数据中的重复值

2.对重复值经行处理

四. 特征观察与处理

1.列如对年龄进行分箱(离散化)处理

五.对文本变量进行转换

1. 查看类别文本变量名及种类

2.将类别文本转换为12345

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


 一.查看空缺的数值所在的位置

方法一
作用为给出样本数据的相关信息概览 :行数,列数,列索引,列非空值个数,列类型,内存占用

 df.info() 
方法二
作用为给出所有的列名,并在后显示各列的空值个数

df.isnull().sum()

 二.对缺失值进行处理

1.判断缺失值

方法1:is的判断速度要快于==,适用于数值,字符串等简单的结构,像列表,元组等复杂些的则无法判断

df[df['Age'] is None] = 0

方法 2:判断数据是否为NAN,为缺失值返回True,否则为False,比上述is判断范围更大

df[df['Age'].isnull()] = 0

 方法3:此判断方法比上述两种更具优势,能够判断数据类型为float64

df[df['Age'] == np.nan] = 0

2.处理缺失值

方法1:删除

df.dropna().head(3) 

 用法dropna()删除所有存在缺失值的行

dropna(axis='columns')删除所有存在缺失值的列 

dropna(how='all')删除缺失所有值的行 

dropna(thresh=2)删除最少缺失两个值的行 

dropna(subset=['列名', '列名'])删除缺失该任一列名下的值的行 

dropna(inplace=True)将具有有效条目的数据帧保留在同一变量中,与第一相似

方法2:替换

 df.fillna(0).head(3) 

用法 fillna(0)将所有的NaN替换为0 #

fillna(method="ffill")将NaN替换为其前方非空值中的元素 

values = {"列名": 替换成的值} , df.fillna(value=values)  完成对应列空值的替换  

fillna(value=values, limit=1),仅替换第一行的NaN 

df2 = pd.DataFrame(np.zeros((行数, 列数)), columns=list("列名")),  df.fillna(df2) df2中的值会替代df的相同位置且为NaN,位置相同为列名相同和所在行数相等

三.重复值观察与处理

1.查看数据中的重复值

df[df.duplicated()]

用法df.duplicated()默认情况下,对于每组重复值,第一个匹配项设置为 False,所有其他值都设置为 True。

#df.duplicated(keep='last')通过使用“last”,每组重复值的最后一次出现设置在 False 上,所有其他值都设置为 True。

df.duplicated(keep=False)通过设置 False,所有重复项均为 True 

df.duplicated(subset=['列名'])要查找特定列上的重复项

2.对重复值经行处理

df = df.drop_duplicates()  # 删除重复的数据,其它用法与subset=['列名']删除特定的一样
df.head()
df.to_csv('test_clear.csv')  # 保存清洗后的数据

四. 特征观察与处理

1.列如对年龄进行分箱(离散化)处理

方法一、将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示

df['AgeBand'] = pd.cut(df['Age'], 5, labels=[1, 2, 3, 4, 5])

用法pd.cut(数组(必须是一维的),分组数,labels=['分组名称'])

方法二、将连续变量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])

 方法三、将连续变量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])

五.对文本变量进行转换

1. 查看类别文本变量名及种类

 value_counts

df['Sex'].value_counts()
df['Cabin'].value_counts()

 DataFrame.value_counts(subset=None, normalize=False, sort=True, ascending=False, dropna=True)

subset:对唯一组合进行计数时要使用的列

normalize:返回比例而不是频率

sort:按频率排序

ascending:按升序排序

dropna:不要包含包含 NA 值的行计数

2.将类别文本转换为12345

方法一: replace

df['Sex_num'] = df['Sex'].replace(['male', 'female'], [1, 2])
df.head()

 用法:将['male','female'],替换成[1,2]

通过replace({0:10,1:100})可以将列表中的所有0替换成10,1替换成100

 replace({'列名': 0, '列名': 5}, 100)将特定列名的0,5替换成100 

replace({'列名': {0: 100, 4: 400}})将特定列中的0替换成100,将4替换成400

 df.replace(regex=r'^”特征“.$', value='目标')将具有包含“特征”的元素替换成‘目标’

 replace({'A': r'^ba.$'}, {'A': 'new'}, regex=True)作用同上但有列的范围

方法二:map

df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2})
df.head()

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)  # 将类别变量转换为虚拟/指示符变量,即将feat中不同类别的量转化成二维的0与1
    df = pd.concat([df, x], axis=1)  # 将x中的数据连接转化到表格上axis=1即为转化成列的形式,axis=0时为行
    # df[feat] = pd.get_dummies(df[feat], prefix=feat)
df.head()
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
# 如果为 True,则返回 DataFrame,每个捕获组包含一列。如果为 False,则返回序列/索引(如果有一个捕获组)或 DataFrame(如果有多个捕获组)

你可能感兴趣的:(python,数据分析)