主要讲述在数据处理及特征分析中利用到的pandas库中的功能,该文以Datawhale提供的资料以及网络搜集的资源整理而成,如有错误欢迎指正。
目录
一.查看空缺的数值所在的位置
二.对缺失值进行处理
1.判断缺失值
2.处理缺失值
三.重复值观察与处理
1.查看数据中的重复值
2.对重复值经行处理
四. 特征观察与处理
1.列如对年龄进行分箱(离散化)处理
五.对文本变量进行转换
1. 查看类别文本变量名及种类
2.将类别文本转换为12345
3. 将类别文本转换为one-hot编码
方法一
作用为给出样本数据的相关信息概览 :行数,列数,列索引,列非空值个数,列类型,内存占用
df.info()
方法二 作用为给出所有的列名,并在后显示各列的空值个数
df.isnull().sum()
方法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
方法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,位置相同为列名相同和所在行数相等
df[df.duplicated()]
用法df.duplicated()默认情况下,对于每组重复值,第一个匹配项设置为 False,所有其他值都设置为 True。
#df.duplicated(keep='last')通过使用“last”,每组重复值的最后一次出现设置在 False 上,所有其他值都设置为 True。
df.duplicated(keep=False)通过设置 False,所有重复项均为 True
df.duplicated(subset=['列名'])要查找特定列上的重复项
df = df.drop_duplicates() # 删除重复的数据,其它用法与subset=['列名']删除特定的一样
df.head()
df.to_csv('test_clear.csv') # 保存清洗后的数据
方法一、将连续变量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])
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 值的行计数
方法一: 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()
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(如果有多个捕获组)