先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
正文
![](https://img-blog.csdnimg.cn/3cc6b491d31f4b649cdd2d68dbdb96df.png)
#### 删除重复值
* 指定 `subset` ,则根据指定的列作为参考进行去重,即如果某两行 `a` 值相同,则会删除第二次的出现的那一行,只保留第一次
* 不指定 `subset` ,则根据所有列作为参考进行去重,只有两行数据 **完全相同** 才会进行去重。
df.drop_duplicates(subset=[‘a’], keep=‘first’)
df.drop_duplicates(keep=‘first’)
![](https://img-blog.csdnimg.cn/16a66e91561b43ac84754a809cb859ba.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARHJlYW3kuLZLaWxsZXI=,size_9,color_FFFFFF,t_70,g_se,x_16)
---
### 筛查重复值
**示例数据**
df = pd.DataFrame({‘name’:[‘Python’,
‘Python’,
‘Java’,
‘Java’,
‘C’],
‘count’: [2, 2, 6, 8, 10]})
![在这里插入图片描述](https://img-blog.csdnimg.cn/af22f5a74d8745aabae10251172d5e38.png)
#### 判断某列是否有重复值
使用 `values_counts()` 对列中各值出现次数进行统计。结果默认按照降序进行排列,只需要判断第一行值的出现次数是否为1即可判断是否存在重复值。
df[‘a’].value_counts()
![在这里插入图片描述](https://img-blog.csdnimg.cn/a0eee3282c9b428e9adc9c84c90b1ee8.png)
使用 `drop_duplicates()` 对重复值进行删除,只保留第一次出现的值,判断处理后的值是否与原 `df` 相等,如果 `False` 就表示有重复值。
df.equals(df.drop_duplicates(subset=[‘a’], keep=‘first’))
False
#### 判断 DataFrame 是否有重复行
同样是使用 `drop_duplicates()` 对重复值进行删除,只保留第一次出现的值,此时不使用 `subset` 参数设置列,默认为全部列,判断处理后的值是否与原 `df` 相等,如果 `False` 就表示有重复值。
df.equals(df.drop_duplicates(keep=‘first’))
False
#### 统计重复行的数量
注意这里的统计是参照所有列来的,只有两行完全相同才会判断为重复行,所以统计的结果是 1 。
len(df) - len(df.drop_duplicates(keep=“first”))
1
#### 显示重复的数据行
先删除重复的行,只保留第一次出现的,得到一个 **行唯一** 的数据集,再使用 `drop_duplicates()` 删除掉 `df` 中存在重复的所有数据,这次不保留第一次出现的重复值,将上述两个结果集进行合并,使用 `drop_duplicates()` 对新生成的数据集进行去重,即可得到重复行的数据。
df.drop_duplicates(keep=“first”)
.append(df.drop_duplicates(keep=False))
.drop_duplicates(keep=False)
![在这里插入图片描述](https://img-blog.csdnimg.cn/82295fcdeedd4158a662299c374d7e62.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARHJlYW3kuLZLaWxsZXI=,size_8,color_FFFFFF,t_70,g_se,x_16)
### 缺失值处理
#### 查找缺失值
缺失值为 `True` ,非缺失值为 `False` 。
df.isnull()
![](https://img-blog.csdnimg.cn/fb7602032eb5431fac2b05eb8570d28f.png)
#### 查找非缺失值
非缺失值为 `True` ,缺失值为 `False` 。
df.notnull()
![](https://img-blog.csdnimg.cn/1326e2efdef7454b90bf7bbd602ed006.png)
#### 显示有缺失值的行
**.isnull**:查找缺失值,主要为了将缺失值的位置标 `True`。
**.T**:行列转置,为下一步 `any` 做准备。
**.any**:一个序列中满足一个 `True`,则返回 `True`。
df[df.isnull().T.any()]
![在这里插入图片描述](https://img-blog.csdnimg.cn/3be1de39fcdd4328acda16b40384bebe.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARHJlYW3kuLZLaWxsZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)
#### 删除缺失值
这里的参数需要注意的比较多,这里着重讲一下。
* **axis**:0 行,1 列
* **how**:
+ **any**:如果有 NaN,删除该行或列。
+ **all**:如果所有值都是 NaN,删除该行或列。
* **thresh**:指定 NaN 的数量,当 NaN 数量达到才删除。
* **subset**:要考虑的数据范围,如:删除缺失行,就用subset指定参考的列,默认是所有列。
* **inplace**:是否修改原数据。
某行如果有缺失值,则删除这一行
df.dropna(axis=0, how=‘any’)
某列如果有缺失值,则删除这一列
df.dropna(axis=1, how=‘any’)
![](https://img-blog.csdnimg.cn/5c3680c162794ddfb25cc35ed5ad3503.png)
#### 填充缺失值
##### 数字或字符串填充
直接指定要填充的数字或字符串。
df.fillna(0)
![](https://img-blog.csdnimg.cn/e966d66d1bc944deb88faf70aa8bb608.png)
##### 用缺失值 前/后 的值填充
* 用缺失值的前一个值(该列上面一个值)填充,如果缺失值在第一行则不填充
* 用缺失值的后一个值(该列下面一个值)填充,如果缺失值在最后一行则不填充
df.fillna(method=‘pad’)
df.fillna(method=‘bfill’)
![](https://img-blog.csdnimg.cn/5fcc36bd2ab2483a91a7f3d072ed8ae9.png)
##### 用缺失值所在列的 均值/中位数 等填充
可以用该列的统计信息来进行填充。如使用 `mean`、`median`、`max`、`min`、`sum` 填充等。
df.fillna(df.mean())
![](https://img-blog.csdnimg.cn/a013c5f08d544756889f327bfb8e300a.png)
---
### 列操作
#### 修改列名
`df.columns` 是直接指定新的列名来替换**所有**的列名。 **(在原数据上进行修改)**
`rename()` 需要指定原名与新名来进行替换。
df.columns = [‘new_name’, ‘new_age’]
df.rename(columns=({‘name’:‘new_name’,‘age’:‘new_age’}))
![](https://img-blog.csdnimg.cn/ae07f12e8ade46caba16a649869a6657.png)
#### 修改列类型
使用 `astype` 来修改列类型。
df[‘age’].astype(str)
![](https://img-blog.csdnimg.cn/3c76411496ad4386866aa86ba7d825eb.png)
#### 将列进行拆分得到多列
`split` 只能对字符串列进行拆分。
df[[‘name1’, ‘name2’]] = df[‘name’].str.split(‘,’, expand=True)
![](https://img-blog.csdnimg.cn/733ca79c6aeb4b698784732f33aa9a3f.png)
#### 将多列合并成新列
同样合并也是字符串类型的列才能进行合并。
df[‘all’] = df[‘name’] + ‘/’ + df[‘age’].astype(str)
![](https://img-blog.csdnimg.cn/ec7d69c3fe5b463abca872f3bf81c3ff.png)
#### 对数值列分区
对于数值列,实际使用的时候可能需要根据指定的范围,将这些数值变为标签值,如衡量产品的指标及格、不及格,成绩是否优秀等。使用是需要指定数值列、各个标签的临界值,临界值的开闭情况(示例中:默认 `left=True` ,指定 `right=False` ,即左闭右开),最后指定标签的名称即可。
df[‘评价’] = pd.cut(df[‘成绩’], [0, 60, 80, np.inf],
right=False, labels=[‘不及格’, ‘良好’, ‘优秀’])
![](https://img-blog.csdnimg.cn/2d8b060815664e61b958a6b24b2894e0.png)
---
### 排序
#### 索引排序
对行索引降序排序
df.sort_index(axis=0, ascending=False)
对列索引降序排序
df.sort_index(axis=1, ascending=False)
![](https://img-blog.csdnimg.cn/352d656bc6d7469bb37a11f4cfd96cec.png)
#### 重置索引
将索引重新排序,原来的索引不保留。
df.reset_index(drop=True)
![](https://img-blog.csdnimg.cn/5d807a4c22834837b9f930a40fb940ac.png)
#### 值排序
先按照名字降序排序,再对相同名字下的成绩进行降序排序。
df.sort_values(by=[‘名字’, ‘成绩’], axis=0, ascending=False)
![](https://img-blog.csdnimg.cn/687a034847f74d7ab7c73484bacfd3d8.png)
#### 创建排名列
使用 `rank` 来进行排名,主要参数 `method` 的取值含义如下:
| `method` | 含义 |
| --- | --- |
| `average` | 默认值,在名次一样的分组中,为各个值分配平均排名(平均数),排名之间存在跳跃 |
| `min` | 使用分组中的最小排名,排名之间存在跳跃 |
| `max` | 使用分组中的最大排名,排名之间存在跳跃 |
| `first` | 按值在原始数据中的出现顺序进行排名,排名之间存在跳跃 |
| `dense` | 同一个分组的排名相同,排名之间不存在跳跃 |
现在按照 **成绩** 列对每行数据进行排名,并新建排名列,几种排名方式下面都已给出。
df[‘排名’] = df[‘成绩’].rank(method=‘average’, ascending=False)
![](https://img-blog.csdnimg.cn/fb0baf8bbebb469ea18e6e98ea42cf76.png)
---
### 分组
#### 对行分组统计
现在对各人的成绩进行分组计算,分别计算总和、均值、最大值。
df.groupby([‘名字’]).sum()
df.groupby([‘名字’]).mean()
df.groupby([‘名字’]).max()
![在这里插入图片描述](https://img-blog.csdnimg.cn/9326879e52e94e79aa886ffe5482c66c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARHJlYW3kuLZLaWxsZXI=,size_16,color_FFFFFF,t_70,g_se,x_16)
注意:此时的索引为 名字,如果想要重置索引,可以使用如下方式。
df.groupby([‘名字’]).sum().reset_index()
![在这里插入图片描述](https://img-blog.csdnimg.cn/b9dd06bd2bf042119140199e8eca6fb6.png)
#### 对不同列使用不同的统计函数
`agg()` 是指定函数使用在某个数列上,然后返回标量值。
`apply()` 是先将数据拆分 >>> 再应用 >>> 最后汇总的过程(只能应用单个函数)。返回多维的数据。
df.groupby([‘名字’]).agg({‘成绩’:[‘sum’,‘mean’,‘max’]})
df.groupby([‘名字’]).apply(max)
![在这里插入图片描述](https://img-blog.csdnimg.cn/961572dbc3a7452796cc7939cd704b42.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARHJlYW3kuLZLaWxsZXI=,size_17,color_FFFFFF,t_70,g_se,x_16)
---
### DataFrame合并
pandas中的合并函数主要是:`merge()`、`concat()`、`append()`,一般用来连接两个及以上 `DataFrame` 。其中,`concat()`, `append()` 用来纵向连接 `DataFrame` 对象, `merge()` 用来横向连接 `DataFrame` 对象。
**三者对比:**
>
> concat()
>
>
> * 连接多个DataFrame
> * 设置特定的键(key)
>
>
> append()
>
>
> * 连接多个DataFrame
>
>
> merge()
>
>
> * 指定列来连接DataFrame
>
>
>
#### merge()
`on` 若指定则该列必须同时出现在这两个 `DataFrame` 中,默认值为两个 `DataFrame` 列中的交集,在本例中即使不指定 `on` ,实际默认值也会按照 `name` 列来进行合并。
`how` 参数详解:
* inner:根据 `on` 指定的列取交集。
* outer:根据 `on` 指定的列取并集。
* left:根据 `on` 指定的列并以左连接的方式合并。
* right:根据 `on` 指定的列并以右连接的方式合并。
pd.merge(df1, df2, on=‘name’, how = “inner”)
pd.merge(df1, df2, on=‘name’, how = “outer”)
pd.merge(df1, df2, on=‘name’, how = “left”)
pd.merge(df1, df2, on=‘name’, how = “right”)
![在这里插入图片描述](https://img-blog.csdnimg.cn/0aaf8dcd9ff547b8a4fc26475d6eef6c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARHJlYW3kuLZLaWxsZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)
#### concat()
`concat()` 可以多个 `DataFrame` 进行合并,根据实际情况可以选择纵向合并还是横向合并。具体看下面的示例。
多个DataFrame纵向合并取交集
pd.concat([df1, df2], ignore_index=True, join=‘inner’,axis=0)
多个DataFrame纵向合并取并集
pd.concat([df1, df2], ignore_index=True, join=‘outer’,axis=0)
多个DataFrame横向合并取交集
pd.concat([df1, df2], ignore_index=False, join=‘inner’,axis=1)
多个DataFrame横向合并取并集
pd.concat([df1, df2], ignore_index=False, join=‘outer’,axis=1)
![](https://img-blog.csdnimg.cn/53c6558424fe4ff598d2923511a799d4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARHJlYW3kuLZLaWxsZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)
另外还可以指定 `key` ,在索引的位置添加原数据的名称。
pd.concat([df1, df2], ignore_index=False, join=‘outer’, keys=[‘df1’, ‘df2’])
![在这里插入图片描述](https://img-blog.csdnimg.cn/e1998ddf14d64a57acec1bf27c3a3c41.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARHJlYW3kuLZLaWxsZXI=,size_14,color_FFFFFF,t_70,g_se,x_16)
#### append()
`append()` 常用于纵向合并,也可以多个 `DataFrame` 进行合并。
df1.append(df2, ignore_index=True)
df1.append([df1, df2], ignore_index=True)
![在这里插入图片描述](https://img-blog.csdnimg.cn/9d439cce0aae417aabddd85345249a18.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARHJlYW3kuLZLaWxsZXI=,size_19,color_FFFFFF,t_70,g_se,x_16)
---
### DataFrame时间处理
**示例数据**
![在这里插入图片描述](https://img-blog.csdnimg.cn/c27ca3e2bc2d4897b95cda5e068a78a3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARHJlYW3kuLZLaWxsZXI=,size_7,color_FFFFFF,t_70,g_se,x_16)
#### 将字符串列转化成时间序列
有时从 csv 或 xlsx 文件中读取的时间,是字符串(`Object`)类型,这时就需要将其转化成 `datetime` 类型,方便后续对时间的处理。
pd.to_datetime(df[‘datetime’])
#### 将时间列作为索引
对于大部分时间序列数据,我们都可以将该列作为索引,来最大的利用时间。这里 `drop=False` 选择不删除 `datetime` 列。
df.set_index(‘datetime’, drop=False)
![在这里插入图片描述](https://img-blog.csdnimg.cn/575fd53dfbb740cdaed3f362fa19ef3a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARHJlYW3kuLZLaWxsZXI=,size_11,color_FFFFFF,t_70,g_se,x_16)
通过索引获取 **1月** 的数据,这里显示前五行。
df.loc[‘2021-1’].head()
![在这里插入图片描述](https://img-blog.csdnimg.cn/652438cbb76c4f7e9f1c94914358ba5f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARHJlYW3kuLZLaWxsZXI=,size_11,color_FFFFFF,t_70,g_se,x_16)
通过索引获取 **1~3月** 的数据。
df.loc[‘2021-1’:‘2021-3’].info()
![在这里插入图片描述](https://img-blog.csdnimg.cn/5feb03bba62b414a8e6a662bc8748002.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARHJlYW3kuLZLaWxsZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)
#### 获取时间的各个属性
这里给出一般需求中可能会用到的属性,同时给出各个方法的实例。
| 常见属性 | 描述 |
| --- | --- |
| `date` | 获取日期 |
| `time` | 获取时间 |
| `year` | 获取年份 |
| `month` | 获取月份 |
| `day` | 获取天 |
| `hour` | 获取小时 |
| `minute` | 获取分钟 |
| `second` | 获取秒 |
| `dayofyear` | 数据处于一年中的第几天 |
| `weekofyear` | 数据处于一年中的第几周(新版使用 `isocalendar().week`) |
| `weekday` | 数据处于一周中的第几天(数字 周一为0) |
| `day_name()` | 数据处于一周中的第几天(英文 Monday) |
| `quarter` | 数据处于一年中的第几季度 |
| `is_leap_year` | 是否为闰年 |
这里随便选第 100 行的日期做示例,各个属性的结果均以注释的形式展示。
df[‘datetime’].dt.date[100]
datetime.date(2021, 4, 11)
df[‘datetime’].dt.time[100]
datetime.time(11, 50, 58, 995000)
df[‘datetime’].dt.year[100]
2021
df[‘datetime’].dt.month[100]
4
df[‘datetime’].dt.day[100]
11
df[‘datetime’].dt.hour[100]
11
df[‘datetime’].dt.minute[100]
50
df[‘datetime’].dt.second[100]
58
df[‘datetime’].dt.dayofyear[100]
101
df[‘datetime’].dt.isocalendar().week[100]
14
df[‘datetime’].dt.weekday[100]
6
df[‘datetime’].dt.day_name()[100]
‘Sunday’
df[‘datetime’].dt.quarter[100]
2
df[‘datetime’].dt.is_leap_year[100]
False
#### 重采样 resample()
重采样分为 **降采样** 和 **升采样** 两种。
降采样指的是采样的时间频率低于原时间序列的时间频率,同时来讲就是一个聚合操作。看示例,下面获取各季度的 `count` 列平均值。`Q` 代表 `quarter` 表示按季度采样。
df.resample(‘Q’,on=‘datetime’)[“count”].mean()
![在这里插入图片描述](https://img-blog.csdnimg.cn/a43fde9bd64547549dd90ac61a203daf.png)
注意:此时的输出的最大时间为06-30, 并不是实际数据中的 05-31。 但是并不影响计算。
升采样与降采样相反,指的是采样的时间频率高于原时间序列的时间频率,相当于获取更细纬度的时间数据,但这样**往往会造成数据中存在大量空值**,实际用的不多,这里就不展开讲解了。
---
### DataFrame遍历方式
#### iterrows() - 遍历行(索引,列值序列)
按行进行遍历,获取行的索引与列值序列,速度较慢,直接看例子。
for index, row in df.iterrows():
print(index)
print(row)
给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
网络安全面试题
绿盟护网行动
还有大家最喜欢的黑客技术
网络安全源码合集+工具包
所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
网络安全面试题
绿盟护网行动
还有大家最喜欢的黑客技术
网络安全源码合集+工具包
所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-lkvqy9jg-1713295976257)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!