首页 > 其他分享 >day4数据清理以及特征提取

day4数据清理以及特征提取

时间:2024-03-14 20:30:14浏览次数:27  
标签:分箱 df day4 清理 DataFrame Sex 特征提取 feat Age

第一步:导入

ps:最后一行是为了查看是否成功导入

缺失值处理

df.info()
df.isnull().sum()

 df.info 是一个用于查看 DataFrame 的基本信息的函数。它可以帮助我们了解 DataFrame 的列名、非空值数量、数据类型等信息。

df.isnull().sum() 是一个用于计算 DataFrame 中每列空值数量的函数。它会返回一个 Series,其中索引为列名,值为对应列的空值数量。

       isnull() 是一个DataFrame的方法,用于检测DataFrame中的每个元素是否为空值(NaN)。如果元素为空值,则返回True,否则返回False

        sum():是一个Series(一维数组)的方法,用于计算Series中所有元素的和。在df.isnull().sum()这个表达式中,sum()方法被用来计算每列中空值的数量。

df[df['Age'].isnull()] = 0
df[df['Age'] == np.nan] = 0
  1. df['Age'].isnull():返回一个布尔型的Series,其中的元素表示对应位置的'Age'列的值是否为空值。
  2. df[df['Age'].isnull()]:使用上一步得到的布尔型Series作为索引,从df中选取出所有'Age'列值为空值的行。
  3. df[df['Age'].isnull()] = 0:将第二步选取出的行中的'Age'列的值替换为0。
  1. df['Age'] == np.nan:返回一个布尔型的Series,其中的元素表示对应位置的'Age'列的值是否为空值。
  2. df[df['Age'] == np.nan]:使用上一步得到的布尔型Series作为索引,从df中选取出所有'Age'列值为空值的行。
  3. df[df['Age'] == np.nan] = 0:将第二步选取出的行中的'Age'列的值替换为0。

链接1 链接2

df.dropna()
df.fillna(0)

df.dropna()df.fillna(0) 是Pandas库中用于处理缺失值的两种常用方法。

  • df.dropna():该方法用于删除DataFrame中的缺失值(NaN)。它会返回一个新的DataFrame,其中不包含任何含有缺失值的行或列。
  • df.fillna(0):该方法用于将DataFrame中的缺失值(NaN)替换为指定的值,这里指定为0。它会返回一个新的DataFrame,其中所有缺失值都被替换为0。

这两种方法的选择取决于具体的数据和分析需求。如果缺失值较多且对结果影响较大,可以选择使用df.dropna()删除含有缺失值的行或列;如果缺失值较少且对结果影响较小,可以选择使用df.fillna(0)将缺失值替换为0或其他合适的值

重复值处理

在Pandas的DataFrame中,重复行指的是内容完全相同的行。这些行的所有列的值都相同,因此被视为重复数据。在数据分析和处理的过程中,重复行可能会对结果产生影响,因此通常需要识别并处理这些重复行

df[df.duplicated()]
df = df.drop_duplicates()

df[df.duplicated()]df = df.drop_duplicates() 是Pandas库中用于处理重复值的两种常用方法。

  • df[df.duplicated()]:该方法返回一个布尔型的Series,其中的元素表示对应位置的行是否为重复行。通过将这个Series作为索引,可以从DataFrame中选取出所有重复的行。
  • df = df.drop_duplicates():该方法会删除DataFrame中的重复行,并返回一个新的DataFrame,其中不包含任何重复行。

这两种方法的选择取决于具体的数据和分析需求。如果需要保留重复行并对其进行进一步处理,可以选择使用df[df.duplicated()]来选取重复行;如果不需要保留重复行,可以选择使用df = df.drop_duplicates()来删除重复行。

特征观察与处理

官方给的内容:

 

数值特征通常可以分为两种类型:连续型数值特征和离散型数值特征。

连续型数值特征
连续型数值特征是指可以在一定范围内任意取值的特征,例如人的身高、体重、年龄等。这类特征的特点是可以取任何实数值,没有特定的边界。

离散型数值特征
离散型数值特征是指只能在特定几个值中取值的特征,例如人的血型、商品的颜色等。这类特征的特点是不能取任意值,只能取特定的几个值。

判断一个数值特征是否为离散型数值特征的方法通常是观察这个特征的取值情况。如果这个特征的取值是有限的,并且取值之间没有明显的顺序关系,那么就可以认为这是一个离散型数值特征。例如,人的血型只有A、B、AB、O四种取值,商品的颜色也只有红色、蓝色、绿色等有限种取值,这些都是离散型数值特征的例子。

需要注意的是,有些数值特征可能既可以是连续的,也可以是离散的,这取决于如何对其进行处理和解释。例如,一个人的年龄可以被视为连续型数值特征,因为年龄可以在任何时候增加一岁;同时,年龄也可以被视为离散型数值特征,例如将年龄分为青年、中年、老年等几个阶段。2 3

 任务一

Q:什么是分箱操作?

分箱操作是一种数据预处理技术,用于将连续变量离散化,简化了数据分析的复杂性,以便更好地处理和分析数据同时也为某些类型的分析和建模提供了更好的基础

1  2  3

分箱,也称为分桶或离散化,是一种常见的数据预处理技术,主要用于将连续数据的间隔分组到“箱”或“桶”中。这个过程可以帮助我们更好地理解数据的分布,同时也可以降低异常值的影响,增加模型的稳定性

在实际应用中,分箱操作通常针对连续型数据进行,例如价格、销量、年龄等。但理论上,分箱也可以对分类型数据进行。比如,有些分类型数据可取的值非常多,像中国的城市这种数据,这种情况下可以通过分箱,让已经是离散型的数据变得更加离散,比如,城市可以被划分为一级城市、二级城市、三级城市,或者把垃圾分为有害垃圾、可回收垃圾、湿垃圾、干垃圾等等。

分箱操作的基本步骤如下:

1. 确定分箱的范围:首先,我们需要确定每个箱子(或桶)的范围。这可以通过设定最小上界和最大上界来实现。这两个上界之间的区域就是我们要划分的箱子。

2. 划分箱子:然后,我们将数据根据其在各个箱子中的位置进行划分。这一步通常是通过将数据映射到相应的箱子标签来完成的。

3. 填充箱子:最后,我们需要将每个箱子中的数据填充到相应的位置。这一步通常是通过将每个箱子中的数据替换为相应的箱子标签来完成的。

值得注意的是,分箱操作可能会使得数据的信息变得模糊,不再那么精确。例如,如果我们把年龄数据分成四个箱子:18岁以下、18至40岁、40至60岁、60岁以上,那么原本取值是任何0-120整数的年龄数据就被分到了这四个固定的值中,这样就会失去一部分精确的信息。

然而,分箱操作也有其优点,例如它可以降低异常值的影响,增加模型的稳定性。当把数据进行分箱处理后,数据会变得更加稳定,之前取值范围不定的数据经过分箱后,变成了取值固定的数据。这样经过分箱后,特征包容异常值的能力增强,特征出现模型无法处理值的可能性也就降低了很多。

  1.  将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
  2. 将连续变量Age划分为(0,5] (5,15] (15,30] (30,50] (50,80]五个年龄段,并分别用类别变量12345表示

  3. 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示

  4. 将上面的获得的数据分别进行保存,保存为csv格式

 

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

#将连续变量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])

 第一个代码块使用pd.cut函数将"Age"列的数据平均分成5个区间,并使用标签[1,2,3,4,5]表示每个区间。这意味着"Age"的值将被映射到这5个类别上。

第二个代码块使用pd.cut函数将"Age"列的数据划分为指定的五个区间:(0,5]、(5,15]、(15,30]、(30,50]、(50,80],并使用标签[1,2,3,4,5]表示每个区间。同样地,"Age"的值将被映射到这5个类别上。

第三个代码块使用pd.qcut函数将"Age"列的数据按照指定的比例进行分箱,即10%、30%、50%、70%和90%。然后使用标签[1,2,3,4,5]表示每个区间。这意味着根据"Age"的分布情况,数据将被映射到这5个类别上。

1  2

任务二

(1) 查看文本变量名及种类
(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示
(3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示

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

 

  1. df['Sex'].value_counts():这个操作用于计算"Sex"列中每个唯一值的频数。它会返回一个Series对象,其中索引为"Sex"列的唯一值,对应的值为每个唯一值在"Sex"列中出现的次数。

  2. df['Sex'].unique():这个操作用于获取"Sex"列中的所有唯一值。它会返回一个包含"Sex"列中所有不重复值的数组

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

from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
    lbl = LabelEncoder()  
    label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
    df[feat + "_labelEncode"] = df[feat].map(label_dict)
    df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))

 

1. 这段代码使用`replace()`函数将DataFrame中的"Sex"列中的值进行替换。具体来说,将"male"替换为1,将"female"替换为2,并将结果存储在新的列"Sex_num"中。

2. 这段代码使用`map()`函数将DataFrame中的"Sex"列中的值进行映射。具体来说,将"male"映射为1,将"female"映射为2,并将结果存储在新的列"Sex_num"中。

3. 这段代码使用`LabelEncoder`类对DataFrame中的"Cabin"和"Ticket"列进行标签编码。首先,通过`unique()`函数获取每个特征的唯一值,并使用`zip()`函数将其与一个从0开始的整数序列进行配对,生成一个字典`label_dict`。然后,使用`map()`函数将原始特征的值映射为对应的整数编码,并将结果存储在新的列"Cabin_labelEncode"和"Ticket_labelEncode"中。最后,使用`fit_transform()`函数将原始特征的值转换为字符串类型,并使用`LabelEncoder`对象进行标签编码,将结果存储在相应的新列中。

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)

这段代码的作用是将DataFrame中的"Age"和"Embarked"列进行独热编码(One-Hot Encoding),并将结果添加到原始DataFrame中。

具体步骤如下:
1. 对于每个特征(feat)在列表["Age", "Embarked"]中,执行以下操作:
2. 使用`pd.get_dummies()`函数对特征进行独热编码。这里使用了`df[feat]`作为输入,表示对当前特征进行独热编码。
3. 将独热编码后的结果存储在变量x中。
4. 使用`pd.concat()`函数将原始DataFrame(df)和独热编码后的结果(x)沿着列方向(axis=1)进行拼接。
5. 将拼接后的DataFrame赋值给原始DataFrame(df)。
6. 注释掉的代码是另一种实现方式,分别对"Age"列进行分箱处理后再进行独热编码,以及直接对"Embarked"列进行独热编码。这些代码被注释掉了,所以不会执行。

任务三

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

这段代码的作用是从DataFrame的"Name"列中提取出姓氏(Title),并将结果存储在新的列"Title"中。

具体步骤如下:
1. 使用`str.extract()`函数对"Name"列进行正则表达式匹配。正则表达式'([A-Za-z]+)\.'表示匹配一个或多个字母,后面跟着一个句点。
2. `expand=False`表示不将匹配结果展开为多列,只保留第一个匹配结果。
3. 将匹配结果存储在新的列"Title"中。

 最后感想:好菜啊,啥都不会,代码还得gpt解析才看得懂

标签:分箱,df,day4,清理,DataFrame,Sex,特征提取,feat,Age
From: https://blog.csdn.net/m0_68812689/article/details/136701266

相关文章

  • Day40:安全开发-JavaEE应用&SpringBoot框架&JWT身份鉴权&打包部署JAR&WAR
    目录SpringBoot-身份鉴权-JWT技术SpringBoot-打包部署-JAR&WAR思维导图Java知识点功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方组件使用等.框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,反射机制待......
  • day4
     会有一个优先队列,把他加进去了,他会自己排序,从小到大依次排列判断下当前队列有没有满,如果满了你又比队列中最小值还小那就continue,没必要插入了如果比最小值大,那就可以插入,他会自动比较大小直接heappop就可以排除最小值最后返回优先队列中的最小值即可     ......
  • 在Docker中,如何批量清理临时镜像文件?
    在Docker中,所谓的“临时镜像”或“虚悬镜像”(danglingimages)是指那些没有被任何容器引用的层,通常是在构建新镜像时遗留下来的中间层。要批量清理这类镜像,你可以使用dockerimages命令结合一些过滤条件来找到它们,然后用dockerrmi命令删除。以下是批量清理临时镜像文件的步骤......
  • 清理挖矿程序的脚本
    systemctldisablemyservice.servicesystemctlstopmyservice.servicesystemctlstatusmyservice.servicerm-fr/usr/lib/systemd/system/myservice.servicerm-fr/root/.cfgrm-fr/usr/bin/mslogrm-fr/usr/bin/playersed-i/disown/d/var/spool/cron/root......
  • 在Docker中,如何清理后台停止的容器?
    在Docker中,清理后台停止的容器可以通过多种方式完成。以下是一些常用的方法:1.手动删除你可以使用dockerps-a命令查看所有的容器,包括已停止的容器。找到你想要删除的容器的ID或名称。然后,使用dockerrm<container_id_or_name>命令来删除它。例如:dockerps-a#列出所有容......
  • windows 查询占用端口进程并清理
    查找占用端口的进程号:netstat-ano|findstr9000根据进程号查找占用端口的进程信息(16240为进程号):tasklist|findstr16240关闭占用端口的进程:使用进程号(16240为进程号):taskkill/f/pid16240 2.使用进程名:taskkill /f ......
  • Qt QVector数据清理和内存清理
    原因在处理大数据时,发现QVector直接用clear后台查看程序所占用的内存并没有下降QVector数据清理1QVector<int>example_vec;2example_vec.clear();QVector内存清理1QVector<int>example_vec;2example_vec.shrink_to_fit();//程序运行到此处时内存才被降下去QV......
  • 这样清理微信,硬盘分分钟多出50GB
    这样清理微信,硬盘分分钟多出50GB:https://blog.csdn.net/m0_69862284/article/details/129095366?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-1-129095366-blog-127171797.235^v43^pc_blog_bottom_relevance_base9&spm=1001.2101.3001.......
  • shell-应用日志清理脚本(通用)
    应用日志清理脚本(通用)#!/bin/bash#================================================================#HEADER#================================================================#Filenameclear-logs.sh#Revision0.0.3#Date......
  • Android 开发Day4
     我们双击进入activity_main.xml先将android.support.constraint.ConstraintLayout改为LinerLayout线性的,意思就是水平的的结构并加入android:orientation="vertical"意思是将所有组件垂直摆放<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android=&......