50个pandas高频操作汇总_50个pandas 高频使用,2024年最新【干货

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文


![](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 (备注网络安全)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

网络安全面试题

绿盟护网行动

还有大家最喜欢的黑客技术

网络安全源码合集+工具包

所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-lkvqy9jg-1713295976257)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值